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

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

#0001 struct Node
#0002 {
#0003 struct Node *next;
#0004 int data;
#0005 };
#0006
#0007 struct List
#0008 {
#0009 struct Node *head;
#0010 HANDLE hMutex;
#0011 };
#0012
#0013 struct List *CreateList()
#0014 {
#0015 List *list = (List *)malloc(sizeof(struct List));
#0016 list->head = NULL;
#0017 list->hMutex = CreateMutex(NULL, FALSE, NULL);
#0018 return list;
#0019 }
#0020
#0021 void DeleteList(struct List *list)
#0022 {
#0023 CloseHandle(list->hMutex);
#0024 free(list);
#0025 }
#0026
#0027 void SwapLists(struct List *list, struct List *list2)
#0028 {
#0029 struct List *tmp_list;
#0030 HANDLE arrhandles[2];
#0031
#0032 arrhandles[0] = list1->hMutex;
#0033 arrhandles[1] = list2->hMutex;
#0034 WaitForMultipleObjects(2, arrHandles, TRUE, INFINITE);
#0035 tmp_list = list1->head;
#0036 list1->head = list2->head;
#0037 list2->head = tmp_list;
#0038 ReleaseMutex(arrhandles[0]);
#0039 ReleaseMutex(arrhandles[1]);
#0040 }

win32多线程 (四) Mutex

时间: 2024-08-28 18:06:58

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

Win32多线程程序设计

Win32多线程程序设计 "多线程多任务"是程序开发者和用户都需要的一个重要资产.从WindowsNT开始,完全支持32位程序的抢占式多任务.带领我们进入了"多线程多任务"时代. 基本概念 进程(processes) 从win32角度来看,进程含有内存和资源,被进程拥有的内存理论上可达2GB,资源包括内核对象(handle,mutex-),user资源(对话框,字符串-),GDI资源(cdc和brush-). 内存(memory) 每个进程存储数据的地方,分为: C

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

之前看侯捷翻译的<win32多线程程序设计>中关于线程同步中的临界区问题,其中举得例子是对链表的操作.死锁的问题是对一个Swaplist函数的问题,现列举代码如下: void SwapLists(List *list, List *list2){ List *tmp_list; EnterCriticalSection(list1->critical_sec); EnterCriticalSection(list2->critical_sec); tmp->list = li

win32多线程(三) 死锁

任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁. void SwapLists(List *list1, List *list2) { List *tmp_list; EnterCriticalSection(list1->m_section); EnterCriticalSection(list2->m_section); tmp->list = list1->head; list1->head = list2->head; list2->head

win32多线程 (一) 线程创建与结束等待

#include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std; DWORD WINAPI ThreadFuncFirst(LPVOID param){ int iCount = 50; while(iCount--){  cout<<"\nThreadFuncFirst:"<<iCount; } return 0;} DWO

Win32 多线程的创建方法,区别和联系

Win32多线程的创建方法主要有: CreateThread() _beginthread()&&_beginthreadex() AfxBeginThread() CWinThread类 一.简介 CreateThread: Win32提供的创建线程的最基础的API,用于在主线程上创建一个线程.返回一个HANDLE句柄(内核对象).在内核对象使用完毕后,一般需要关闭,使用CloseHandle()函数. _beginthread()&&_beginthreadex():_

win32多线程 (二)线程同步之临界区 (critical sections)

所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码.你可能必须在程序的许多地方处理这一块可共享的资源.所有这些程序代码可以被同一个critical  section 保护起来.为了阻止问题发生,一次只能有一个线程获准进入critical  section 中.critical section 并不是核心对象.使用方法: CRITICAL_SECTION g_section; 1:初始化 InitializeCriticalSection(&g_section

win32多线程设计总结

近期拜读了win32多线程程序设计,总结了这么几点 多线程的主要问题在于线程同步,而线程调用由操作系统实现,因此实现线程同步必须有操作系统提供支持,书中提到过以前我所用过的busy loop与sleep结构来实现线程同步,当时我的感觉就是没有其他办法了,直到遇上了wait系列API,下面就来总结一下各种线程同步方法 1.临界区的使用,优点不需要产生系统内核对象,速度快,效率高.关键API: void InitializeCriticalSection(LPCRITICAL_SECTION lpC

Win32 多线程学习笔记

学到的API函数 一.线程 创建线程.结束线程.获取线程的结束码 CreateThread ExitThread GetExitCodeThread 二.线程结束时触发 创建线程之后,等待线程的结束之后,再继续执行 WaitForSingleObject 创建多个线程之后,等待一组线程(或其中的一个)结束,再继续执行 WaitForMultipleObjects 将消息循环与内核对象的等待合并 MsgWaitForMultipleObjects 三.同步 SendMessage 是同步的 Pos

win32多线程编程

关于多线程多进程的学习,有没有好的书籍我接触的书里头关于多线程多进程部分,一是<操作系统原理>里面讲的相关概念   一个是<linux基础教程>里面讲的很简单的多线程多进程编程,再就是<VC开发>里头讲一点总觉得自己学的不透彻,多线程多进程这部分没啥信心    <win32多线程程序设计>华中科技大学出版社2001-1版本