windows线程同步的方式主要有四种:互斥对象Mutex、事件对象event和关键代码段criticalSection, 信号量

对于上面介绍的三种线程同步的方式,它们之间的区别如下所述:
● 互斥对象和事件以及信号量都属于内核对象,利用内核对象进行线程同步时,速度较慢,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。
● 关键代码段工作在用户方式下,同步速度较快,但在使用关键代码段时,很容易进入死锁状态,因为在等待进入关键代码段时无法设定超时值。
用户级别的:关键代码段,只能本进程中
内核级别的:互斥量/事件/信号量,可以跨进程

通常,在编写多线程程序并需要实现线程同步时,首选关键代码段,由于它的使用比较简单,如果是在MFC程序中使用的话,可以在类的·构造函数Init中调用InitializeCriticalSection函数,在该类的析构函数中调用DeleteCriticalSection函数,在所需保护的代码前面调用EnterCriticalSection函数,在访问完所需保护的资源后,调用LeaveCriticalSection函数。可见,关键代码段在使用上是非常方便的,但有几点需要注意:

A 在程序中调用了EnterCriticalSection后,要相应的调用LeaveCriticalSection函数,否则其他等待该临界区对象所有权的线程将无法执行。

B 如果访问关键代码段时,使用了多个临界区对象,就要注意防止线程死锁的发生。另外,如果需要在多个进程间的各个线程间实现同步的话,可以使用互斥对象和事件对象或者信号量。

MFC---多线程(各种线程同步的比较总结)_mfc


MFC---多线程(各种线程同步的比较总结)_互斥对象_02

什么是线程安全?
假如你的代码在多线程执行和单线程执行永远是完全一样的结果,那么你的代码是线程安全的。
陈硕《muduo》