并行开发笔记-3.使用互斥元(临界区)保护

来源:互联网 发布:成都中科大cms漏洞 编辑:程序博客网 时间:2024/05/16 02:16

互斥元(Mutex)也就是锁
保护一段资源只许拥有锁的线程或进程去访问

    **WaitForSingleObject(hMutex, INFINITE);    //互斥锁保护的部分    ......    ReleaseMutex(hMutex);**

注意互斥锁的名称要对上[本文是这玩意儿 _T(“MAIN_MUTEX“)]
简单思路图
这里写图片描述

//使用互斥元保护class ThreadTest3{public:    static int main(int argc, char** argv)    {        ThreadTest3 td;        td.RUN();        return 1;    };public:    void RUN(void)    {        //CreateMutex 第二个参数为TRUE时主线程立即占有互斥元锁        //这里FALSE 创建了互斥元后可以用WaitForSingleObject去抢占了        HANDLE hMutex = CreateMutex(NULL, FALSE, _T("__MAIN_MUTEX__"));        HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadStart, NULL, 0, NULL);        //Sleep(100);       //这里最好加个Sleep防止被下面的WaitForSingleObject先抢了        cout << "Waiting execution..." << endl;        //主线程等待锁 自然就会阻塞线程直到完成了        WaitForSingleObject(hMutex, INFINITE);        ReleaseMutex(hMutex);        CloseHandle(hMutex);        CloseHandle(hThread);        cout << "Threadend..." << endl;    };    static DWORD ThreadStart(LPVOID lpParameter)    {        HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T("__MAIN_MUTEX__"));        //抢锁咯 抢到就往下过不然就抢到死等INFINITE         WaitForSingleObject(hMutex, INFINITE);        cout << "ThreadStart..." << endl;        for (int i = 1; i <= 20; i++)        {            cout << i << " ";            Sleep(100);        }        cout << endl;        for (int i = 1; i <= 20; i++)        {            cout << i << " ";            Sleep(100);        }        cout << endl;        //完事了解锁 其他线程有能在WaitForSingleObject抢锁咯        ReleaseMutex(hMutex);        return 0;    };};

程序输入:(和之前一样)
Waiting execution…
ThreadStart…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Threadend…
然后闪退!因为主线程没有消息循环阻塞!

原创粉丝点击