[c++] C++에서의 동시성 컨트롤
C++는 동시성을 다루는 데 매우 강력한 기능을 제공합니다. 다중 스레드를 사용하여 병렬 처리를 수행하거나, 비동기 작업을 처리하는 등 여러 가지 상황에서 동시성을 다룰 수 있습니다.
스레드와 뮤텍스
C++에서는 실행 스레드를 만들고 관리하기 위한 표준 라이브러리가 있습니다. std::thread
클래스를 사용하여 새로운 스레드를 만들고, std::mutex
클래스를 사용하여 뮤텍스를 통해 스레드 간의 상호배타적인 접근을 제어할 수 있습니다.
다음은 std::mutex
를 사용하여 공유 데이터에 대한 안전한 접근을 보장하는 간단한 예제 코드입니다.
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int shared_data = 0;
void increment_shared_data() {
mtx.lock();
shared_data++;
mtx.unlock();
}
int main() {
std::thread t1(increment_shared_data);
std::thread t2(increment_shared_data);
t1.join();
t2.join();
std::cout << "Shared data value: " << shared_data << std::endl;
return 0;
}
원자적 연산과 원자적 변수
원자적 연산은 다른 스레드에서 진행 중인 작업에 영향을 주지 않고, 해당 연산이 반드시 완전히 실행되는 것을 보장하는 연산입니다. C++에서는 std::atomic
템플릿 클래스를 통해 원자적인 변수를 선언할 수 있습니다.
다음은 std::atomic
을 사용하여 원자적인 증가 연산을 수행하는 간단한 예제 코드입니다.
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> shared_data(0);
int main() {
std::thread t1([](){
shared_data++;
});
std::thread t2([](){
shared_data++;
});
t1.join();
t2.join();
std::cout << "Shared data value: " << shared_data << std::endl;
return 0;
}
참조
- C++ 동시성 프로그래밍 가이드: https://en.cppreference.com/w/cpp/thread
- C++ Atomics 라이브러리 참조: https://en.cppreference.com/w/cpp/atomic
C++에서 동시성을 다루는 여러 가지 방법이 있지만, 적절한 도구와 기술을 사용하여 스레드를 안전하게 제어할 수 있습니다.