zoukankan      html  css  js  c++  java
  • 线程同步(windows平台):互斥对象

    一:介绍

    互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权。

    二:函数说明

    创建互斥对象:
        HANDLE CreateMutex(
                LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全属性结构指针,可为NULL,表示默认安全性
                BOOL bInitialOwner,     //是否占有该互斥量,TRUE:占有,FALSE:不占有
                LPCTSTR lpName         //设置互斥对象的名字
        );
    获得互斥对象:
        DWORD WaitForSingleObject( 
                HANDLE hHandle,        //互斥对象的句柄 
                DWORD dwMilliseconds    //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
    }
    释放互斥对象:
        BOOL ReleaseMutex(HANDLE hHandle)

    三:步骤

    1. 声明互斥对象:HANDLE hMutex
    2. 创建互斥对象:hMutex = CreateMutex(NULL, FALSE, NULL)
    3. 使用互斥对象:WaitForSingleObject(hMutex, INFINITE)
    4. 释放互斥对象:ReleaseMutex(hMutex)

    四:代码实现

     1 /********************************************************
     2 Copyright (C),  2016-2018,
     3 FileName:        t13
     4 Author:            woniu201
     5 Email:             wangpengfei.201@163.com
     6 Created:           2018/10/23
     7 Description:    线程同步-互斥对象
     8 ********************************************************/
     9 #include <iostream>
    10 #include <Windows.h>
    11 
    12 using namespace std;
    13 
    14 volatile int number = 1;
    15 HANDLE hMutex;
    16 
    17 DWORD CALLBACK ThreadFun1(LPVOID pParam)
    18 {
    19     while (1)
    20     {
    21         WaitForSingleObject(hMutex, INFINITE);
    22         cout << "Thread1:" << number++ << endl;
    23         ReleaseMutex(hMutex);
    24         if (number >= 1000)
    25         {
    26             break;
    27         }
    28         
    29     }
    30     return 0;
    31 }
    32 
    33 DWORD CALLBACK ThreadFun2(LPVOID pParam)
    34 {
    35     while (1)
    36     {
    37         WaitForSingleObject(hMutex, INFINITE);
    38         cout << "Thread2:" << number++ << endl;
    39         ReleaseMutex(hMutex);
    40         if (number >= 1000)
    41         {
    42             break;
    43         }
    44     }
    45     return 0;
    46 }
    47 
    48 
    49 int main()
    50 {
    51     hMutex = CreateMutex(NULL, FALSE, NULL); 
    52 
    53     CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
    54     CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
    55 
    56     getchar();
    57     return 1;
    58 }

    扫码关注公众号

    专注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

  • 相关阅读:
    查询避免Unknown column ‘xxx’ in ‘where clause
    Spring依赖循环:The dependencies of some of the beans in the application context form a cycle
    POJ(北京大学)刷题导航
    ACM使用Java提交总是超时的解决方法
    申请了服务器,建立了新博客。 不在用这个了。
    jeecg数据库添加字段后表单的修改
    jeecg普通表和数据字典的关联
    jeecg添加滚动图
    jeecg定时任务的bug记录
    classpath究竟是指哪里?
  • 原文地址:https://www.cnblogs.com/woniu201/p/9838432.html
Copyright © 2011-2022 走看看