• 多线程同步机制的几种方法


    Critical Section
    Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程
    的各线程之间。它是:
     一个局部性对象,不是一个核心对象。
     快速而有效率。
     不能够同时有一个以上的 critical section 被等待。
     无法侦测是否已被某个线程放弃。

    可以实现线程间互斥,不能用来实现同步。

    Semaphore
    Semaphore 被用来追踪有限的资源。它是:
    一个核心对象。

     没有拥有者。

     可以具名,因此可以被其他进程开启。
     可以被任何一个线程释放(released)。

    既能实现线程间互斥,也能实现线程间同步。

    在跨进程中使用时,如果拥有信号量的线程意外结束,其它进程不会收到通知。

    Mutex
    Mutex 是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚
    至即使那些线程分属不同进程。它是:
    一个核心对象。
     如果拥有 mutex 的那个线程结束,则会产生一个 “abandoned” 错
    误信息。
    i可以具名,因此可以被其他进程开启。
    只能被拥有它的那个线程释放(released)。

    在跨进程中使用时,如果拥有互斥器的进程意外结束,其它进程会收到一个WAIT_ABANDOEND消息。


    Event 
    Event object 通常使用于 overlapped I/O,或用来设计某些自定
    义的同步对象。它是:
     一个核心对象。
    可是用来实现线程的互斥与同步。
    可以具名,因此可以被其他进程开启。

    在跨进程中使用时,如果拥有信号量的线程意外结束,其它进程也不会受到通知。

    注意:临界区和互斥器都有“线程所有权”的概念,所以它们是不能用来实现线程间的同步的,只能用来实现互斥。原因是由于创建临界区或互斥器的线程可以不用等待LeaveCriticalSection(),SetEvent()就可以无条件进入保护的程序段,因为它拥有这个权利。另外,互斥器可以很好的处理”遗弃“操作。若线程在未释放对向象的时候就意外终止的,其它线程可以等待到一个WAIT_ABANDONED_0。但是事件和信号量都不能做到。

    事件和信号量都可以实现线程和进程间的互斥和同步。

    就使用效率来说,临界区的效率是最高的,因为它不是内核对象,而其它的三个都是核心对象,要借助操作系统来实现,效率相对来说就比较低。

    但如果要跨进程使用还是要用到互斥器、事件对象和信号量。

    总之:在设计时,首先尽量不要使用全局变量,如果不得以先然后考虑使用Inter...()函数,然后在是临界区对象,最后才是事件、互斥器、信号量。

  • 相关阅读:
    挑战程序设计竞赛 2.1 最基础的“穷竭搜索”
    HDU 5145 NPY and girls(莫队算法+乘法逆元)
    BZOJ 4300 绝世好题(位运算)
    HDU 5724 Chess(博弈论)
    BZOJ 1177 [Apio2009]Oil(递推)
    Codeforces 706D Vasiliy's Multiset(可持久化字典树)
    HDU 3374 String Problem (KMP+最小最大表示)
    POJ 2758 Checking the Text(Hash+二分答案)
    HDU 5782 Cycle(KMP+Hash)
    POJ 3450 Corporate Identity(KMP)
  • 原文地址:https://www.cnblogs.com/sexybear/p/4561034.html
Copyright © 2020-2023  润新知