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;

    }

  • 相关阅读:
    uni-app中的数值监控方式及函数的封装和引用方式
    uni-app引入阿里矢量图在移动端不显示的问题
    前端登录页点击获取验证码的实现
    app每次更新版本时调用js代码提示用户下载更新
    @Dependson注解与@ConditionalOnBean注解的区别
    navicat for mysql 12中文破解版(安装+破解)--亲测可用
    Kubernetes 常用命令
    MySQL MERGE存储引擎
    MySQL中MyISAM与InnoDB区别
    什么是事务?什么是事务日志以及用途?
  • 原文地址:https://www.cnblogs.com/blogofwu/p/4387554.html
Copyright © 2011-2022 走看看