[c++] C++에서의 동기화 기술과 스레드 보호 방법
C++는 다중 스레드 환경에서 안정적인 프로그램을 작성하기 위해 동기화 기술과 스레드 보호 방법을 제공합니다. 이 기술들을 사용하여 여러 스레드가 공유 자원에 안전하게 접근할 수 있도록 보장할 수 있습니다.
Mutex와 Lock
C++에서의 기본적인 동기화 매커니즘으로는 std::mutex
와 std::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
등을 통해 다중 스레드 환경에서의 안전한 동기화와 스레드 보호를 제공합니다.
참고 자료
- cppreference.com - std::mutex
- cppreference.com - std::condition_variable
- cppreference.com - std::atomic