win32多线程 (四) Mutex
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的更多相关文章
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...
- 深入浅出Win32多线程程序设计之基本概念
一.深入浅出Win32多线程程序设计之基本概念[转] 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓 ...
- 多线程学习:win32多线程编程基本概念(转)
一.定义: 1.进程和线程的区别 进程:是程序的执行过程,具有动态性,即运行的程序就叫进程,不运行就叫程序 ,每个进程包含一到多个线程.线程:系统中的最小执行单元,同一进程中有多个线程,线程可以共享资 ...
- win32多线程: 线程创建与结束等待
#include<Windows.h> #include<iostream> using namespace std; /*1.在启动一个线程之前,必须为线程编写一个全局的线程 ...
- 由《win32多线程程序设计》临界区的问题所想
之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLi ...
- Win32多线程编程(1) — 基础概念篇
内核对象的基本概念 Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API.当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Serv ...
- Win32 多线程的创建方法和基本使用
Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)AfxBeginThread() ...
- win32多线程-异步过程调用(asynchronous Procedure Calls, APCs)
使用overlapped I/O并搭配event对象-----win32多线程-异步(asynchronous) I/O事例,会产生两个基础性问题. 第一个问题是,使用WaitForMultipleO ...
- win32多线程-重写消息循环
最近正在学习<win32多线程程序设计>,这是其中一段重写消息循环的代码事例,以后可能用的上. while (!quit || gNumPrinting > 0) { // Wait ...
随机推荐
- python的一些开源库
SQLAlchemy——数据持久层框架 简介 SQLAlchemy 主要由两部分组成,一个 SQL 工具包和一个关系对象映射(ORM),它能让开发者完全发挥出 SQL 的灵活性与强大的能量.他实现了一 ...
- DD测磁盘读写性能
1.测试磁盘的纯写入性能 dd if=/dev/zero of=/file [oracle@11g ~]$ touch ddTest[oracle@11g ~]$ time dd if=/dev/ze ...
- ASP.NET WebApi通过自定义ControllerSelector来自定义Controller的选择
在web api中,我们可以通过给Cotroller类添加RoutePrefixAttribute来定义url与Controller之间的映射,但是有时候有一些特殊情况下,我们需要做一些特殊处理来将某 ...
- MySQL中的交并差
Mysql只提供了并集(union),没有提供差集,和交集,但是我们可以用union来实现交和差,下面即是实现方式: 首先创建两个表: ERROR 1064 (42000): mysql> cr ...
- 【openCV学习笔记】【2】读取并播放一段视频
#include <iostream> #include <opencv/highgui.h> int main(int argc, char** argv){ cvNamed ...
- 配置和启动脚本(bash shell学习01)
bash是 Bourne Again Shell简称 ,从unix系统的sh发展而来 查看当前shellecho $SHELL查看系统支持的shellcat /etc/shells cd /binls ...
- 【转】Jmeter在命令行运行技巧
For non-interactive testing, you may choose to run JMeter without the GUI. To do so, use the followi ...
- Python 列表笔记
列表解析 squares = []for i in range(1,11): square = i**2 squares.append(square)print squares ########## ...
- java代码多线程实现如下
总结:我的比赛得了最差的奖,老师提都没提,所以,我应该有自知之明,你并不是他最喜欢的学生 import java.util.Scanner; //利用多线程实现输入等待…… public class ...
- html 文字垂直居中
html 文字垂直居中 <span style="float:right; padding-right:30px;line-height:64px" class=" ...