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;

    }

  • 相关阅读:
    JS经典面试题
    javascript数组(1) ——sort的工作原理及其他数组排序方法
    怎么去掉javascript 的Array的重复项
    Intellij IDEA运行Error ——Command line is too long
    angular-waring:global Angular与local Angular版本不一致问题
    idea(集成python)下载python插件失败
    PLSQL登录oracle显示无监听或协议适配器错误
    maven不能加载ojdbc6.jar的解决方法
    eclipse安装maven插件
    windows下gitbash安装教程
  • 原文地址:https://www.cnblogs.com/chenzuoyou/p/3185596.html
Copyright © 2011-2022 走看看