반응형
Mutex : 흔히 하는 실수
#include <iostream>
#include <chrono>
#include <mutex>
#include <string>
#include <thread>
void PrintMessage(const std::string& message)
{
static std::mutex sMutex;
sMutex.lock();
std::cout << message << std::endl;
//sMutex.unlock();
}
int main()
{
std::thread thread(PrintMessage, "Message from a child thread.");
PrintMessage("Message from a main thread.");
thread.join();
return 0;
}
return을 사용한다던지, unlock을 작성하지 않은 경우 문제가 발생합니다.
해결 방법 C++17
#include <mutex>
#include <thread>
#include <iostream>
#include <vector>
#include <functional>
#include <chrono>
#include <string>
void PrintMessage(const std::string& message)
{
static std::mutex sMutex;
std::scoped_lock<std::mutex > lock(sMutex);
std::cout << message << std::endl;
}
int main()
{
std::thread thread(PrintMessage, "Message from a child thread.");
PrintMessage("Message from a main thread.");
thread.join();
return 0;
}
std::scoped_lock
매개변수로 전달된 뮤텍스들을 내포하는 개체를 만듭니다. 개체 생성시에 뮤텍스를 잠그고 범위를 벗어나 소멸될 떄 풀어줍니다. 즉, 데드락을 방지합니다. C++14 의 경우, std::lock_gurad를 사용할 수 있습니다. 그러나 이떄는 뮤텍스는 하나만 전달 가능합니다.
반응형
'SW > C++' 카테고리의 다른 글
C++ : condition_variable::wait() : 사용법, 주의사항, 예제, 활용 방법 (0) | 2020.03.30 |
---|---|
C++ : condition_variable, unique_lock : 개념, 정의, 활용 방법 (0) | 2020.03.29 |
C++ : mutex (뮤텍스) : 예제, 사용법, 활용 방법 (0) | 2020.03.20 |
C++ : 쓰레드 : sleep_for(), yield() : 개념, 예제, 사용 방법 (0) | 2020.03.19 |
C++ : thread : 람다식 활용한 예제 : 쓰레드 리턴 값 참조 방법 (0) | 2020.03.18 |