zoukankan      html  css  js  c++  java
  • MFC线程(三):线程同步事件(event)与互斥(mutex)

    前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到.

    Win32 API中的线程事件

    HANDLE hEvent = NULL;

    void MainTestFun{

    hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);

    SetEvent(hEvent);

    char g_charArray[4];

    CString szResult;

    //下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问

    AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S

    AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B

    AfxBeginThread(GetResult,);  //返回BBBB

    }

    //其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896

    UINT FunOne(LPVOID pParam){

    WaitForSingleObject(hEvent, INFINITE);  //类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内

    //其他线程还没有释放资源则该线程自动中止.

    for(int i =0; i < 4; i++){

    g_charArray[i] = 'S';

    Sleep(1);

    }

    SetEvent(hEvent);  //类似LeaveCriticalSection

    return 0;

    }

    MFC中的线程事件类

    CEvent g_cEvent; //实例化一个事件类

    void MainTestFun{

    g_cEvent.SetEvent();

    char g_charArray[4];

    CString szResult;

    //下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问

    AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S

    AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B

    AfxBeginThread(GetResult,); //返回BBBB

    }

    //其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896

    UINT FunOne(LPVOID pParam){

    WaitForSingleObject(g_cEvent, INFINITE); //类似EnterCriticalSection

    //其他线程还没有释放资源则该线程自动中止.

    for(int i =0; i < 4; i++){

    g_charArray[i] = 'S';

    Sleep(1);

    }

    g_cEvent.SetEvent(); //类似LeaveCriticalSection

    return 0;

    }

    Win32 API中的互斥(mutex)

    HANDLE hMutex = NULL;

    void MainTestFun{

    hMutex= CreateMutex(NULL,FALSE,NULL);

    char g_charArray[4];

    CString szResult;

    //下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问

    AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S

    AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B

    AfxBeginThread(GetResult,); //返回BBBB

    }

    //其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896

    UINT FunOne(LPVOID pParam){

    WaitForSingleObject(hMutex, INFINITE);//类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内

    //其他线程还没有释放资源则该线程自动中止.

    for(int i =0; i < 4; i++){

    g_charArray[i] = 'S';

    Sleep(1);

    }

    ReleaseMutex(hMutex );//类似LeaveCriticalSection

    return 0;

    }

    MFC中的互斥类(CMutex)

     

    CMutex g_cMutex;

    void MainTestFun{

    char g_charArray[4];

    CString szResult;

    //下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问

    AfxBeginThread(FunOne,NULL); //FunOne给数组赋值全为S

    AfxBeginThread(FunTwo,NULL); //FunTwo也给数组赋值全为B

    AfxBeginThread(GetResult,); //返回BBBB

    }

    //其他两个函数FunOne或GetResult也同样添加两行这样的代码.这两函数的定义见上一篇http://blog.csdn.net/weiwenhp/article/details/8650896

    UINT FunOne(LPVOID pParam){

    g_cMutex.Lock();//类似EnterCriticalSection,这里的INFINITE表示会一直等其他的线程执行完了再执行.如果写成1000则表示只等1秒钟.1秒内

    //其他线程还没有释放资源则该线程自动中止.

    for(int i =0; i < 4; i++){

    g_charArray[i] = 'S';

    Sleep(1);

    }

    g_cMutex.Unlock();//类似LeaveCriticalSection

    return 0;

    }

  • 相关阅读:
    Double-Array Trie 原理解析
    LeetCode 之 Longest Valid Parentheses(栈)
    [Unity3D]Unity3D游戏开发之从Unity3D到Eclipse
    走进Struts2(一) — Struts2的执行流程及其工作原理
    网页页面NULL值对浏览器兼容性的影响
    基于cocos2d-x-3.2学习Box2D(一)
    记忆方法与高速阅读——什么是高速阅读
    ArcGIS 教程:Workflow Manager 高速浏览
    【cocos2d-x 3.7 飞机大战】 决战南海I (三) 敌机实现
    C语言事实上不简单:数组与指针
  • 原文地址:https://www.cnblogs.com/blogofwu/p/4387554.html
Copyright © 2011-2022 走看看