我是C++新手。在学习线程是如何工作的时候,我发现在开始时调用WaitForSingleObject(x)并在最后调用ReleaseMutex(x)是非常烦人的。所以我写了一个课程来为我做这件事,但我不确定这个影响,我做对了。奇迹是否有更简化的方法来实现?下面是我如何做到这一点:C++:如何简化线程锁定?
class MutexLock {
public:
MutexLock(HANDLE hMutex) {
m_hMutex = hMutex;
}
void Lock() {
WaitForSingleObject((m_hMutex), INFINITE);
}
~MutexLock() {
if (m_hMutex != NULL) {
ReleaseMutex(m_hMutex);
std::cout << "Mutex released." << std::endl;
}
}
private:
HANDLE m_hMutex;
};
我如何使用类:
class TestMutex
{
public:
TestMutex(void) {
m_mutex = CreateMutex(NULL, FALSE, NULL);
std::cout << "Mutex created." << std::endl;
}
~TestMutex(void) {
if (m_mutex != NULL)
CloseHandle(m_mutex);
}
void Func1(void) {
MutexLock ml(m_mutex);
ml.Lock();
std::cout << "Func1: Owning mutex." << std::endl;
std::cout << "Press enter key to end this." << std::endl;
ReadKey(GetStdHandle(STD_INPUT_HANDLE));
}
void Func2(void) {
MutexLock ml(m_mutex);
ml.Lock();
//std::cout << "Press enter key to start this." << std::endl;
//ReadKey(GetStdHandle(STD_INPUT_HANDLE));
std::cout << "Func2: Owning mutex." << std::endl;
std::cout << "Press enter key to end this." << std::endl;
ReadKey(GetStdHandle(STD_INPUT_HANDLE));
}
private:
HANDLE m_mutex;
};
在主要功能:
int _tmain(int argc, _TCHAR* argv[])
{
TestMutex * tm = new TestMutex();
HANDLE aThread[2];
for (int i = 0; i < 2; i++)
{
aThread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)tm, 0, 0);
}
WaitForMultipleObjects(2, aThread, TRUE, INFINITE);
for (int i = 0; i < 2; i++)
{
CloseHandle(aThread[i]);
}
delete tm;
ReadKey(GetStdHandle(STD_INPUT_HANDLE));
return 0;
}
这是别人通常怎么办线程锁的方式吗?
为什么不使用[线程支持库](http://en.cppreference.com/w/cpp/thread)中的标准成语?这应该简化你的代码! –
使用'std :: lock_guard','std :: thread',如果你必须使用'std :: mutex'。 – noobProgrammer