深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 522|回复: 0
打印 上一主题 下一主题

互斥量Mutex

[复制链接]

800

主题

1379

帖子

7706

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7706
跳转到指定楼层
楼主
发表于 2019-6-12 21:11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhgc 于 2019-6-12 21:13 编辑

Delphi多线程学习(5):互斥量Mutex
      互斥量是系统内核对象,谁拥有就谁执行。它与临界区工作很类似。不同处在于:1、互斥量可以跨进程边界同步线程。2、可以给互斥量取个名字,通过引用互斥量的名字来使用一个已知的互斥量对象。

     使用互斥量之类的对象需要反复调用系统内核,期间需要进行进程上下文转换和控制级别转换,大概需要耗费400到600个时间周期。

      又是图书馆的比喻,现在是搞一个锁,把钥匙(互斥量句柄)交给管理员(操作系统),每一个人(线程)想要借书的时候,都要向管理员拿钥匙。当有人在使用的时候,另一人必须等待,等到钥匙有空的时候(互斥量进入信号状态),才能拿到钥匙(拥有了句柄)办理借书业务(此时互斥量进入非信号状态直到办完业务)。

   使用互斥量的步骤:

1、声明一个全局的互斥量句柄变量(var hMutex: THandle;);

2、创建互斥量:CreateMutex(
                          lpMutexAttributes: PSecurityAttributes;
                          bInitialOwner: BOOL;  
                          lpName: PWideChar   ): THandle;

  (lpMutexAttributes参数:指向TSecurityAttributes的指针,安全属性,一般用缺省安全属性nil;

    bInitialOwer参数:表示创建的互斥量线程是否是互斥量的属主,如果该参数为False互斥量就没属主,一般来讲应设为False,否则如果设为True的话,要当主线程结束其他线程才成为它的属主才能运行;

   lpName参数:是互斥量的名字,若打算取名的话,则传入nil。)

3、用等待函数控制线程进入同步代码块:WaitForSingleObject(
                                                            hHandle: THandel;
                                                           dwMilliseconds: DWORD): DWORD;

(hHandel参数:是对象的句柄,不同对象信号状态不同,对于互斥量而言当没有线程占有时,互斥量就时入信号状态;

   dwMilliseconds参数:可以是一个时间段,可以是0表示仅检查对象状态后立即返回,可以是INFINITE值表示函数一直等待直到对象进入信号状态;

返回值常量如下:WAIT_ABANDONED指定的对象是互斥量对象,拥有这个互斥量对象的线程在没有释放互斥量之前就已经终止,称作废弃互斥量,此时该互斥量归调用线程所拥有,并把这个互斥量设为非信号状态;WAIT_OBJECT_0指定对象的进入信号状态;WAIT_TIMEOUT等待时间已过,对象状态依然是无信号状态)

4、执行线程运行代码。

5、线程运行完后释放互斥量的拥有权:ReleaseMutex(hMutex: THandle);

6、最后关闭互斥量:CloseHandle(hMutex: THandle);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 06:58 , Processed in 0.023118 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表