Mutex 用途和critical  section 非常类似,不过Mutex是内核对象,速度比section慢。Mutexes可以跨进程使用。另外Mutex在等待的时候可以设置等待时间。

以下是两种对象的相关函数比较:
CRITICAL_SECTION Mutex 核心对象
--------------------------------------------------------------------------------------
InitializeCriticalSection() CreateMutex()
OpenMutex()
--------------------------------------------------------------------------------------
EnterCriticalSection() WaitForSingleObject()
WaitForMultipleObjects()
MsgWaitForMultipleObjects()
--------------------------------------------------------------------------------------
LeaveCriticalSection() ReleaseMutex()
--------------------------------------------------------------------------------------
DeleteCriticalSection() CloseHandle()

具体API使用,参考相关资料。这里说下OpenMutex(),我们可以指定一个名字,这个名字是系统其他程序也可见的,所以应该起个特别些的。我们可以用Op enMutex()打开,如果返回已经存在,我们就可以识别的了自己的程序是否已经被开启,这在一个软件只允许开启一个程序进程的时候比较好用,比如你不想自己的程序在系统中开启多个,就可以这么做了。

这里,解决哲学家进餐的问题,即5个傻子用5只筷子吃饭,如果一个人抓住一只就不松手的5个傻子吃饭的问题

HANDLE arrayHandles[] = {};//模拟5只筷子
for (int index = ; index < ; index++)
{
arrayHandles[index] = CreateMutex(NULL, FALSE,NULL);
}
//
WaitForMultipleObjects(, arrayHandles, TRUE, INFINITE);//傻子可以吃饭的条件是等到两只筷子都在手上的时候。
//,可以吃饭了

WaitForMultipleObjects() 修正前面讲到的SwapLists死锁问题

# struct Node
# {
# struct Node *next;
# int data;
# };
#
# struct List
# {
# struct Node *head;
# HANDLE hMutex;
# };
#
# struct List *CreateList()
# {
# List *list = (List *)malloc(sizeof(struct List));
# list->head = NULL;
# list->hMutex = CreateMutex(NULL, FALSE, NULL);
# return list;
# }
#
# void DeleteList(struct List *list)
# {
# CloseHandle(list->hMutex);
# free(list);
# }
#
# void SwapLists(struct List *list, struct List *list2)
# {
# struct List *tmp_list;
# HANDLE arrhandles[];
#
# arrhandles[] = list1->hMutex;
# arrhandles[] = list2->hMutex;
# WaitForMultipleObjects(, arrHandles, TRUE, INFINITE);
# tmp_list = list1->head;
# list1->head = list2->head;
# list2->head = tmp_list;
# ReleaseMutex(arrhandles[]);
# ReleaseMutex(arrhandles[]);
# }

win32多线程 (四) Mutex的更多相关文章

  1. Win32多线程编程(3) — 线程同步与通信

      一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...

  2. 深入浅出Win32多线程程序设计之基本概念

    一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓 ...

  3. 多线程学习:win32多线程编程基本概念(转)

    一.定义: 1.进程和线程的区别 进程:是程序的执行过程,具有动态性,即运行的程序就叫进程,不运行就叫程序 ,每个进程包含一到多个线程.线程:系统中的最小执行单元,同一进程中有多个线程,线程可以共享资 ...

  4. win32多线程: 线程创建与结束等待

    #include<Windows.h> #include<iostream> using namespace std; /*1.在启动一个线程之前,必须为线程编写一个全局的线程 ...

  5. 由《win32多线程程序设计》临界区的问题所想

    之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLi ...

  6. Win32多线程编程(1) — 基础概念篇

      内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...

  7. Win32 多线程的创建方法和基本使用

    Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)AfxBeginThread() ...

  8. win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)

    使用overlapped I/O并搭配event对象-----win32多线程-异步(asynchronous) I/O事例,会产生两个基础性问题. 第一个问题是,使用WaitForMultipleO ...

  9. win32多线程-重写消息循环

    最近正在学习<win32多线程程序设计>,这是其中一段重写消息循环的代码事例,以后可能用的上. while (!quit || gNumPrinting > 0) { // Wait ...

随机推荐

  1. hexo配置主题发表文章

    将本地hexo博客部署到github上了,如果想换我们自己喜欢的主题(默认为landscape),同时也要发表发表文章呢,下面给介绍下: 1,进入hexo官网,预览自己想要的主题,https://gi ...

  2. 第15届浙江省赛 E LIS

    LIS Time Limit: 1 Second      Memory Limit: 65536 KB      Special Judge DreamGrid is learning the LI ...

  3. easyui tree 加载展开全部节点

    $(function () { $('#tbClientListCont').tree({ checkbox: false, url: '/ashx/Client/tbClientList.ashx? ...

  4. python开发进程:进程开启方式&多进程

    一,进程的开启方式 利用模块开启进程 from multiprocessing import Process import time,random import os def piao(name): ...

  5. activemq artemis安装运行及其在springboot中的使用

    安装 创建broker 在springboot中的使用 依赖 配置 Producer Consumer Rest使用 安装 http://activemq.apache.org/artemis/dow ...

  6. new Com

    CreateOleObject System.Win.ComObj.hpp #include <objbase.h>     Winapi.ActiveX.pas   CoInitiali ...

  7. ffmpeg转码flv到avi《转》

    一个视频转码器,则需要对视频进行解码,然后再对视频进行编码,因而相当于解码器和编码器的结合. 下面图列举了一个视频的转码流程. 输入的视频封装格式是flv 视频编码标准是H.264 音频编码标准是AA ...

  8. linux中ftp配置文件详解

    vsftpd配置文件采用"#"作为注释符,以"#"开头的行和空白行在解析时将被忽略,其余的行被视为配置命令行,每个配置命令的"="两边不要留 ...

  9. 最长回文子串(Mirrored String II)

    Note: this is a harder version of Mirrored string I. The gorillas have recently discovered that the ...

  10. C#向pdf 添加水印

    调用直接这样用: //PDFHelper.AddImageWatermarkPDF(path, "D://my.pdf", Server.MapPath("/HtmlTo ...