[c++] C++에서의 동기화 기술과 스레드 보호 방법

C++는 다중 스레드 환경에서 안정적인 프로그램을 작성하기 위해 동기화 기술과 스레드 보호 방법을 제공합니다. 이 기술들을 사용하여 여러 스레드가 공유 자원에 안전하게 접근할 수 있도록 보장할 수 있습니다.

Mutex와 Lock

C++에서의 기본적인 동기화 매커니즘으로는 std::mutexstd::lock_guard가 있습니다. std::mutex는 공유 자원에 대한 접근을 제한하는 뮤텍스를 생성할 수 있게 해주고, std::lock_guard는 뮤텍스를 사용하여 범위 기반 자동 락을 제공합니다.

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void func() {
    std::lock_guard<std::mutex> lock(mtx);
    // 공유 자원에 대한 안전한 작업 수행
}

int main() {
    std::thread t1(func);
    std::thread t2(func);

    t1.join();
    t2.join();
    return 0;
}

조건 변수

std::condition_variable을 사용하면 특정 조건이 충족될 때까지 스레드를 대기시킬 수 있습니다.

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void work() {
    std::unique_lock<std::mutex> lock(mtx);
    while (!ready) {
        cv.wait(lock);
    }
    // 조건이 충족되면 실행할 작업 수행
}

int main() {
    std::thread t(work);
    
    // 작업 완료 후 조건 충족 통보
    {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_one();
    
    t.join();
    return 0;
}

원자적 연산

C++11부터 제공되는 std::atomic 템플릿은 원자적 연산을 가능하게 합니다. 이를 통해 경쟁 조건이 발생하지 않도록 스레드 간에 안전하게 값을 공유할 수 있습니다.

#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> count(0);

void increment() {
    for (int i = 0; i < 1000; ++i) {
        count++;
    }
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);

    t1.join();
    t2.join();

    std::cout << "Result: " << count << std::endl;
    return 0;
}

결론

C++는 std::mutex, std::condition_variable, 그리고 std::atomic 등을 통해 다중 스레드 환경에서의 안전한 동기화와 스레드 보호를 제공합니다.

참고 자료