가장 간단하게 mutex써보기
#include <iostream>
#include <mutex>
#include <string>
#include <thread>
void PrintMessage(const std::string& message)
{
static std::mutex sMutex;
// 물론 이런식으로 static을 쓰는건 좋지 못한 습관
sMutex.lock();
std::cout << message << std::endl;
sMutex.unlock();
}
int main() {
std::thread thread(PrintMessage, "Message from a child thread");
PrintMessage("Waiting the child thread");
thread.join();
return 0;
}
이런 실수가 발생할 수 있다.
#include <iostream>
#include <mutex>
#include <string>
#include <thread>
void PrintMessage(const std::string& message)
{
static std::mutex sMutex;
// 물론 이런식으로 static을 쓰는건 좋지 못한 습관
sMutex.lock();
std::cout << message << std::endl;
// sMutex.unlock();
// unlock을 안한경우
}
int main() {
std::thread thread(PrintMessage, "Message from a child thread");
PrintMessage("Waiting the child thread");
thread.join();
return 0;
}
scoped_lock으로 해결해보자
void PrintMessage(const std::string& message)
{
static std::mutex sMutex;
// 물론 이런식으로 static을 쓰는건 좋지 못한 습관
std::scoped_lock<std::mutex> lock(sMutex);
std::cout << message << std::endl;
}
void PrintMessage(const std::string& message)
{
static std::mutex sMutex;
// 물론 이런식으로 static을 쓰는건 좋지 못한 습관
// 다음과 같이 나눌 경우 scoped_lock을 별도로 걸 수 있다.
{
std::scoped_lock<std::mutex> lock(sMutex);
std::cout << message << std::endl;
}
{
std::scoped_lock<std::mutex> lock(sMutex);
std::cout << message << std::endl;
}
}