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;

    }

  • 相关阅读:
    node.js的querystring模块
    jsonp的作用
    js开发性能(一)
    express创建第一个web应用
    安装express
    关于【歧视】的一点事
    在统计报表中用到的sql语法记录
    北京民航总医院杀医事件
    那些自杀的人似乎更有勇气
    河南人究竟偷了多少井盖?
  • 原文地址:https://www.cnblogs.com/chenzuoyou/p/3185596.html
Copyright © 2011-2022 走看看