Win32中线程的几种同步控制特点说明

    技术2022-07-21  69

    1. 临界区(CRITICAL_SECTION):

    (1). 速度快(据称速度比互斥体快了100倍),使用方便; (2). 只适用于单一进程的各个线程之间; (3). 容易产生死锁(两个线程都进入了各自的临界区,导致两个线程相互等待对方的临界区时,出现无限等待的情况); (4). 不是核心对象,无法侦测其是否已被某个线程放弃(即无法确定某个线程在离开时已经释放了对应的临界区); (5). 如果由于某种原因导致线程离开时没有释放临界区,则此临界区永远被锁定,其他线程永远无法进入此临界区; (6). 同一个线程可以多次进入同一个临界区,后面进入时不会发生等待,不过必须要求进入和离开调用的相关函数要成对;

    2. 互斥体(Mutex):

    (1). 是内核对象,可以跨进程使用; (2). 可以等待一个mutex; (3). 只能被拥有它的那个线程释放; (4). 如果线程离开时没有释放mutex,则外部能够得知; (5). 速度比临界区要慢; (6). 同一个线程可以多次wait一个互斥体,并不会发生阻塞;

    3. 信号量(Semaphore):

    (1). 具有数量,被用来追踪有限资源; (2). 是解决生产者-消费者模型的首选; (3). 是一个核心对象,因此也可以wait; (4). 可以跨进程使用; (5). 可以被任何线程释放; (6). 同一个线程可以wait同一个信号量多次,但是一旦信号量的数量变为0,则即使是同一个线程,也会发生阻塞;

    4. 事件(Event):

    (1). 功能强大,可以用于IO完成端口模型; (2). 其是否激活完全由用户控制,自由度高; (3). 容易产生死锁。比如对于一个AutoSet的事件来说,如果A线程Set或Pulse这个事件的时候,B线程还未wait这个事件,则当A完成了Set或Pulse后,B线程的wait永远等不到这个事件被激活,因为AutoSet的事件被A线程激活后立马又变成非激活状态了,B线程还未wait,所以侦测不到事件的激活状态。

    5. Interlocked相关函数:

    (1). 特别适合对引用计数进行同步控制(对32位整数进行同步控制); (2). 可用于自旋锁;

    Processed: 0.015, SQL: 9