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

  1. 以下是两种对象的相关函数比较:
  2. CRITICAL_SECTION Mutex 核心对象
  3. --------------------------------------------------------------------------------------
    InitializeCriticalSection() CreateMutex()
  4. OpenMutex()
  5. --------------------------------------------------------------------------------------
    EnterCriticalSection() WaitForSingleObject()
  6. WaitForMultipleObjects()
  7. MsgWaitForMultipleObjects()
  8. --------------------------------------------------------------------------------------
    LeaveCriticalSection() ReleaseMutex()
  9. --------------------------------------------------------------------------------------
    DeleteCriticalSection() CloseHandle()

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

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

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

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

  1. # struct Node
  2. # {
  3. # struct Node *next;
  4. # int data;
  5. # };
  6. #
  7. # struct List
  8. # {
  9. # struct Node *head;
  10. # HANDLE hMutex;
  11. # };
  12. #
  13. # struct List *CreateList()
  14. # {
  15. # List *list = (List *)malloc(sizeof(struct List));
  16. # list->head = NULL;
  17. # list->hMutex = CreateMutex(NULL, FALSE, NULL);
  18. # return list;
  19. # }
  20. #
  21. # void DeleteList(struct List *list)
  22. # {
  23. # CloseHandle(list->hMutex);
  24. # free(list);
  25. # }
  26. #
  27. # void SwapLists(struct List *list, struct List *list2)
  28. # {
  29. # struct List *tmp_list;
  30. # HANDLE arrhandles[];
  31. #
  32. # arrhandles[] = list1->hMutex;
  33. # arrhandles[] = list2->hMutex;
  34. # WaitForMultipleObjects(, arrHandles, TRUE, INFINITE);
  35. # tmp_list = list1->head;
  36. # list1->head = list2->head;
  37. # list2->head = tmp_list;
  38. # ReleaseMutex(arrhandles[]);
  39. # ReleaseMutex(arrhandles[]);
  40. # }

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. 【java规则引擎】drools6.5.0版本中kmodule.xml解析

    kmodule.xml文件存放在src/main/resources/META-INF/文件夹下. <?xml version="1.0" encoding="UT ...

  2. 使用 key 登录时分开记录操作历史记录

    线上服务器一般都是配置 key 登录,一个账号可以多个工作人员连接,操作命令历史却全部记录在一个文件中,当然后查看某条命令是谁执行的时候就不好查了.这时候我们就可以通过配置 histroy 相关环境变 ...

  3. sublime文件对比插件--sublimerge

    网上很多文件对比的基本都要收费,所以还是干脆看看sublime有没插件算了. 结果还是有一个:sublimerge 1 先安装该插件: 2 然后在sublime下都打开要对比的两个文件: 3 然后在其 ...

  4. php sprintf()

    在写php代码的时候,有时候会用到sprintf()这个函数,那么它是怎么用的呢? 学习源头: http://www.w3school.com.cn/php/func_string_sprintf.a ...

  5. 开学初的c

    cout<<a[i]<<" " 这个是先输出a[i]再输出空格 cout<<endl      这个是直接换行cout<<a[i]& ...

  6. java随机数组

    import java.util.Random; public class Ccore { public static void main(String[] args) { for(int i=1;i ...

  7. 分布式缓存系统 Memcached 哈希表操作

    memcached 中有两张hash 表,一个是“主hash 表”(primary_hashtable),另外一个是“原hash 表”(old_hashtable).一般情况下都在主表中接受操作,在插 ...

  8. python开发面向对象基础:人狗大战学面向对象

    一,通过函数写人狗大战这个故事 #!/usr/bin/env python #_*_coding:utf-8_*_ #1.函数 人模子 def person(name,level,life_value ...

  9. 南京邮电大学网络攻防平台WEB题

    平台地址:http://ctf.nuptsast.com/ 签到题: 右键查看源代码,得到flag md5 collision: 传入的a的md5值要为0e开头的,但不能是QNKCDZO,百度一个0e ...

  10. 摄影之HDR

    摄影之HDR 高动态范围图像(High-Dynamic Range,简称HDR),相比普通的图像,可以提供更多的动态范围和图像细节,根据不同的曝光时间的LDR(Low-Dynamic Range)图像 ...