windows下的互斥锁和临界区有什么区别?

时间:2015-07-06 09:24:26

标签: windows mutex critical-section

我已阅读this,我了解到在windows环境下互斥锁和临界区之间至少存在两个区别。

  1. 速度,由this
  2. 中的代码显示
  3. 互斥体可以在进程之间共享,但关键部分只能在一个进程中使用
  4. 我可以理解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);
        }
    }
    

    这两个案例给出了相同的结果,我想这是因为我没有生成不同的过程,所以我该怎么做才能看到互斥和临界区之间的区别?

0 个答案:

没有答案