
全部展开
线程同步机制:

1,事件
事件是同步线程的最灵活的方法. 事件具有两个状态: 兴奋状态和非兴奋状态. 也称为信号状态和无信号状态. 事件有两种类型: 手动重置事件和自动重置事件. 在将手动重置事件设置为激发状态之后,所有等待的线程将被唤醒并保持在激发状态,直到程序再次将其设置为未激发状态为止. 将自动重置事件设置为激发状态后,它将唤醒“ a”个等待线程,然后自动返回未激发状态. 因此,理想的是使用自动重置事件来同步两个线程. MFC中的对应类是CEvent. CEvent构造函数默认情况下会创建一个自动重置事件,并且处于未触发状态. 可以使用三个函数来更改事件的状态: SetEvent,ResetEvent和PulseEvent. 使用事件同步线程是一种理想的方法,但是在实际使用过程中应注意,在自动重置事件上调用SetEvent和PulseEvent可能会导致死锁,您必须小心.
2,关键部分
CRITICAL_SECTION是最快的. 其他内核锁(事件,互斥体)每个内核条目都需要数千个CPU周期.

使用关键部分时的第一条建议是不要长时间锁定资源. 这里的时间较长是相对的,取决于程序. 对于某些控制软件,可能是几毫秒,但是对于其他程序,可能是几分钟. 但是您必须在进入关键部分后尽快离开以释放资源. 如果不发布该怎么办?答案是不. 如果主线程(GUI线程)想要进入一个尚未释放的关键部分windows 线程同步,呵呵,程序将挂起!关键部分的一个缺点是关键部分不是核心对象,并且无法知道进入关键部分的线程是活动的还是死的. 如果进入关键部分的线程死亡,系统将无法知道是否释放了关键资源,并且无法释放关键部分. 资源. Mutex弥补了这一缺点. MFC中Critical Section的相应实现类是CcriticalSection. CcriticalSection :: Lock()进入关键部分,而CcriticalSection :: UnLock()离开关键部分.
3,互斥体

互斥锁的功能类似于关键部分. 区别在于: Mutex比Critical Section花费更多的时间,但是Mutex是核心对象(Event,Semaphore也是),可以在各个进程中使用,并且等待锁定的Mutex可以设置TIMEOUT,而不像Critical Section这样. ,无法知道关键区域的状况,他已经死了,等等. MFC中的相应类是CMutex. Win32函数包括: 创建互斥对象CreateMutex(),打开互斥对象OpenMutex(),发布互斥对象ReleaseMutex(). Mutex的所有权不属于产生它的线程,而是等待该Mutex的最后一个线程(WaitForSingleObject等),尚未执行ReleaseMutex()操作. 拥有Mutex的线程就像进入关键部分. 一次只能有一个线程拥有Mutex. 如果拥有Mutex的线程在返回前未调用ReleaseMutex(),则该Mutex将被丢弃,但是当其他线程等待(WaitForSingleObject等)此Mutex时,它仍然可以返回并获得WAIT_ABANDONED_0返回值. 您可以知道Mutex是Mutex独有的.
4,信号量
信号量是最古老的同步机制. 信号量是解决生产者/消费者问题的关键要素. 相应的MFC类是Csemaphore. Win32函数CreateSemaphore()用于生成信号量. ReleaseSemaphore()用于解锁. 信号量的当前值的重要性表示当前可用资源的数量. 如果Semaphore的当前值为1,则意味着仍有一个锁定操作可以成功执行. 如果当前值为5,则意味着可以成功执行另外五个锁定操作. 当调用Wait ...且其他函数需要锁定时,如果Semaphore的当前值不为0,则Wait ...立即返回,资源数量减少1. 调用ReleaseSemaphore()时,资源数量增加减1,则不会超过最初设置的资源总数.
线程之间的通信:
线程通常将数据传递到另一个线程. Worker线程可能需要告知其他人其工作已完成,而GUI线程可能需要为Worker线程提供新的工作. 通过PostThreadMessage(),您可以将消息传递到目标线程windows 线程同步,当然,目标线程必须具有消息队列. 与标准技术(例如,使用全局变量)相比,将消息用作通信方法具有很大的优势. 如果对象是同一进程中的线程,则可以发送自定义消息并将数据传递到目标线程. 如果线程位于不同的进程中,则涉及进程之间的通信.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-146874-1.html
喘气吗
这样不好吧
有种就什么方便面都不要吃