c++多线程重点难点(三)Mutex
来源:互联网 发布:数据库文件提取数据 编辑:程序博客网 时间:2024/06/09 17:40
互斥量
互斥量是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。使用互斥量Mutex主要将用到四个函数
创建互斥量:CreateMutex
函数返回一个互斥量的句柄或者NULL
打开互斥量:OpenMutex
函数返回一个互斥量的句柄或者NULL
触发互斥量:ReleaseMutex
访问互斥资源前应该要调用等待函数,结束访问时就要调用ReleaseMutex()来表示自己已经结束访问,其它线程可以开始访问了。
销毁互斥量:CloseHandle
内核对象的销毁都可以用这个方法
要注意的是:
1.互斥量解决不了线程间的同步问题
2.互斥量和关键段一样拥有“线程拥有权”
3.遗弃特性:
比如有一个占用互斥量的线程在调用ReleaseMutex()触发互斥量前就意外终止了(相当于该互斥量被“遗弃”了),那么所有等待这个互斥量的线程是否会由于该互斥量无法被触发而一直阻塞?这显然不合理。因为占用某个互斥量的线程既然终止了那足以证明它不再使用被该互斥量保护的资源,所以这些资源完全并且应当被其它线程来使用。因此在这种“遗弃”情况下,系统自动把该互斥量内部的线程ID设置为0,并将它的递归计数器复置为0,表示这个互斥量被触发了。然后系统将“公平地”选定一个等待线程来完成调度(被选中的线程的WaitForSingleObject()会返回WAIT_ABANDONED_0)。
下面有两个程序用来实现mutex的遗弃特性,运用这两个程序时要先启动程序一再启动程序二,将程序一中//exit(0);前面的注释符号去掉,这样程序一在触发互斥量之前就会因为执行exit(0);语句而且退出,程序二会收到WAIT_ABANDONED消息并输出“拥有互斥量的进程意外终止”:
//程序一#include <stdio.h>#include <conio.h>#include <windows.h>const char MUTEX_NAME[] = "Mutex_MoreWindows";int main(){ HANDLE hMutex = CreateMutex(NULL, TRUE, MUTEX_NAME); //创建互斥量 printf("互斥量已经创建,现在按任意键触发互斥量\n"); getch(); //exit(0); ReleaseMutex(hMutex); printf("互斥量已经触发\n"); CloseHandle(hMutex); return 0;}
//程序二#include <stdio.h>#include <windows.h>const char MUTEX_NAME[] = "Mutex_MoreWindows";int main(){ HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, MUTEX_NAME); //打开互斥量 if (hMutex == NULL) { printf("打开互斥量失败\n"); return 0; } printf("等待中....\n"); DWORD dwResult = WaitForSingleObject(hMutex, 20 * 1000); //等待互斥量被触发 switch (dwResult) { case WAIT_ABANDONED: printf("拥有互斥量的进程意外终止\n"); break; case WAIT_OBJECT_0: printf("已经收到信号\n"); break; case WAIT_TIMEOUT: printf("信号未在规定的时间内送到\n"); break; } CloseHandle(hMutex); return 0;}
- c++多线程重点难点(三)Mutex
- 多线程(C++)同步Mutex
- 多线程(C++)同步Mutex
- C++多线程(mutex类)(三)
- C++多线程重点难点(二)理解
- c++多线程重点难点(四)semaphore
- c++多线程重点难点(五)Event
- c++多线程重点难点(一)interlocked系列原子操作
- C++11多线程(三):std:mutex
- c++多线程重点难点(六)CriticalSection
- linux多线程mutex (一)
- c# 多线程 --Mutex(互斥锁)
- 学习笔记 -- Win32多线程程序设计(三) 同步机制 Critical section and Mutex
- C# 多线程(三)
- C++——多线程编程(二)std::mutex 线程同步、解决资源竞争问题
- windows 多线程(五) 互斥量(Mutex)
- 《探索C++多线程》:mutex源码(一)
- 《探索C++多线程》:mutex源码(二)
- Spring源码深度解析(一)Spring的整体架构
- windbg使用网线(kdnet)联调机器如何配置
- RTSP
- Linux 127.0.0.1无法ping通问题解决
- IDEA 常用快捷键
- c++多线程重点难点(三)Mutex
- Hbase单机模式安装教程
- JAVA视频网盘分享
- Android Activity、Window、View三者之间的关系
- python矩阵中matrix()和array()函数区别
- Java多线程--并发中集合的使用PriorityBlockingQueue
- 技术人如何才能做好绩效管理提升团队绩效?
- gensim中doc2vec调参
- js 使用正则判断某字符在字符串中出现次数