多进程/多线程的同步

本文介绍了多进程/多线程同步中的关键概念和API,包括事件、互斥量、信号量、定时器和临界区。事件通过设置信号状态控制线程访问,互斥量实现进程间的资源独占,信号量控制资源访问数量,定时器用于定时触发,临界区则保证一次只有一个线程访问特定区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

同步对象及常用API

1、 事件

事件(Event)是一个同步对象,它有两种状态:有信号状态和无信号状态。线程只有在事件有信号的时候才能获取事件,并设置事件为无信号状态,使得其他线程不能访问事件所保护的数据或代码段。线程使用完后应该将事件设置为有信号状态,以使其他线程能够使用。

API:

SetEvent:设置事件状态为有信号状态。

CreateEvent:创建一个事件对象。

ResetEvent:重设事件对象状态为无信号状态。

OpenEvent:通过返回一个已存在事件对象的句柄,使得进程使用同一个事件对象

PulseEvent:设置指定的事件对象为有信号的,然后重设为无信号的。它用于释放等待线程。

WaitForSingleObject:等待一个事件。

2、  互斥量

互斥量(mutex)与临界区非常相似,只是互斥量可在进程间使用。互斥量通过强制每个线程拥有互斥量对象使线程轮流使用资源,每次只有一个线程拥有互斥量对象。

API:

ReleaseMutex:释放特定互斥量对象的所有权,在拥有权线程完成使用该互斥量控制的资源时使用该API。

CreateMutex:创建一个互斥量对象。

OpenMutex:通过返回一个已创建的互斥量对象的句柄在多个进程间同步。

3、  信号灯

信号量(Semaphores)被一定数量的线程用于控制对资源的访问(与临界区相反,临界区只允许一个线程访问资源或代码段)。信号量有个资源计数器(resource counter)。每个要访问信号量控制的资源的线程等待信号量,并将资源计数器减1。若计数器为0,则没有资源了,并且将来要访问资源的请求要等待。当一个线程使用完资源后,它释放信号量,即将资源计数器加1。

API:

CreateSemaphore:创建一个信号量,并设置其资源计数器。

ReleaseSemaphore:释放一个信号量,并将其资源计数器加1.

WaitForSingleObject:等待一个信号量(或者任何对象)。

CloseHandle:关闭句柄,并释放资源。

 

4、  定时器

它等待某一特定时刻的到来,并通知等待线程。

5、  临界区

它每次只允许一个线程访问资源,如公共数据或一段代码。与其他同步对象如互斥量相比,临界区相对较快

API:

InitalizeCriticalSection: 在使用下面API之前初始化临界区对象。

EnterCriticalSection: 它使调用线程等待临界区对象,并在获得拥有权时返回。

TryEnterCriticalSection: 与EnterCritical一样,只是该API不会等待。

DeleteCriticalSection:它释放临界区对象使用的系统资源。此时临界区对象不能被任何线程占用。

LeaveCriticalSection: 释放对临界区对象的拥有权。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值