我已阅读this,我了解到在windows环境下互斥锁和临界区之间至少存在两个区别。
我可以理解this提供的代码中的第1点,但我没有得到第2点,任何人都可以用一个例子来解释这个问题?
我试图通过以下案例自己理解。
关键部分
CRITICAL_SECTION gCS;
DWORD WINAPI fun_1(LPVOID lpParam){
::EnterCriticalSection(&gCS);
while (true){
std::cout << "Here is fun_1\n";
Sleep(1000);
}
::LeaveCriticalSection(&gCS);
}
DWORD WINAPI fun_2(LPVOID lpParam){
::EnterCriticalSection(&gCS);
while (true){
std::cout << "Here is fun_2\n";
Sleep(1000);
}
::LeaveCriticalSection(&gCS);
}
int main(){
HANDLE thread1, thread2;
thread1 = CreateThread(NULL, 0, fun_1, NULL, 0L, NULL);
thread2 = CreateThread(NULL, 0, fun_2, NULL, 0L, NULL);
while (true){
std::cout << "Main sleep\n";
Sleep(5000);
}
}
互斥
CMutex gMu;
DWORD WINAPI fun_1(LPVOID lpParam){
CSingleLock lock(&gMu);
lock.Lock();
while (true){
std::cout << "Here is fun_1\n";
Sleep(1000);
}
lock.Unlock();
}
DWORD WINAPI fun_2(LPVOID lpParam){
CSingleLock lock(&gMu);
lock.Lock();
while (true){
std::cout << "Here is fun_2\n";
Sleep(1000);
}
lock.Unlock();
}
int main(){
HANDLE thread1, thread2;
thread1 = CreateThread(NULL, 0, fun_1, NULL, 0L, NULL);
thread2 = CreateThread(NULL, 0, fun_2, NULL, 0L, NULL);
while (true){
std::cout << "Main sleep\n";
Sleep(5000);
}
}
这两个案例给出了相同的结果,我想这是因为我没有生成不同的过程,所以我该怎么做才能看到互斥和临界区之间的区别?