zoukankan      html  css  js  c++  java
  • 互斥(mutex)

    互斥(mutex)
    互斥比较类似阻塞,关键在于互斥可以跨进程的线程同步,很多只允许应用程序运行一次的实例就是用互斥方法来实现的。互斥用到以下的API函数:
    createMutex(), 创建互斥对象。
    releaseMutex(), 解除互斥关系。

    互斥的一般使用流程:
    首先createMutex创建互斥对象,然后waitForSingleObject进入互斥环境,当用到同步的代码执行完成后,用releaseMutex解除互斥关系,当所有线程访问完后,调用
    closeHandle方法释放互斥对象。

    waitForSingleObject()函数来防止其它线程进入同步区域的代码。
    function waitforsingleobject(hHandle: Thandle; dwMilliseconds: DWORD):   DWORD; stdcall;
    这个函数可以使当前线程在dwmilliseconds指定的时间内睡眠,直到hHandle参数指定的对象进入发信号状态为止。一个互斥对象不再被线程拥有时,它就进入发信号状态
    当一个进程要终止时,它就进入发信号状态。dwmilliseconds参数可以设为0,这意味着只检查hhandle参数指定的对象是否处理发信号状态,而后立即返回。dwmilliseconds参数设为INFINITE,表示如果信号不出现将一直等下去。

    waitForSingeObject()使用的返回值及其含义:
    WAIT ABANDONED
    指定的对象是互斥对象,并且拥有这个互斥对象的线程在没有释放此对象之前就已终止。此时就称互斥对象被抛弃。这种情况下,这个互斥对象归当前线程所有,并把它设为不发信号状态。
    WAIT OBJECT 0
    指定的对象处于发信号状态
    WAIT TIMEOUT
    等待的时间已过,对象仍然是非发信号状态

    当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用waitForsingleobject()的线程就成为该互斥对象的拥有者,此互斥对象设为不发信号状态。当线程调用releaseMutex()并传递一个互斥对象的句柄作为参数时,这种拥有关系就被解除,互斥对象重新进入发信号状态。除waitforsingleobject()外,还可以使用waitformultipleobject()和msgwaitformultipleobject(),它们可以等待几个对象变为发信号状态。
  • 相关阅读:
    模拟赛20181101 雅礼 Wearry 施工 蔬菜 联盟
    模拟赛20181031 雅礼 Wearry 养花 折射 画作
    set/priority_queue的运算符重载
    set的完整用法
    最长公共上升子序列 O(n^2)
    无向图边双联通分量 tarjan 模板
    ID 迭代加深搜索 模板 埃及分数
    树上背包DP Luogu P2014 选课
    A* 第k短路
    [POJ3468]关于整数的简单题 (你想要的)树状数组区间修改区间查询
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940786.html
Copyright © 2011-2022 走看看