一、四种同步方法
互斥量、临界段、事件、信号量
二、同步的原因
我们之所以在线程之间进行同步,是因为:
1、由于线程间竞争共享资源。
2、为完成某个任务而需要协作。
总的来说就是因为竞争和协作。
三、Win32 API——API函数——MFC封装
CSyncObject同步对象:CEvent、CSemaphore、CMutex、CCriticalSetion
同步访问对象:CMultiLock、CSingleLock
四、异同
1、互斥量、事件、信号量:内核对象,可用于进程之间同步
临界段:只能用于进程内的线程同步
互斥量和临界段:功能类似,但从性能上讲,临界段由于互斥量。
2、事件的不同是:不保护共享资源。而是用于等待某个事件,在特定的事件时发送信号。
它主要是协调线程间的动作
3、信号量的不同是:允许一个以上的线程同时访问共享资源。
它主要是用于资源计算。
五、选择
1、访问共享资源前,判断是否要等待某事件发生。若是,使用事件进行同步。
2、一个应用程序是否可多个线程同时访问共享资源。若是,使用信号量进行计数。
3、是否有多个进程使用共享资源。若是,使用互斥量。
4、若以上都不满足,使用临界段。
六、死锁问题
1、死锁例子:
假设有线程A、B,它们必须同时获得资源1、2才能继续执行。
在某一时刻,A获得1,B获得2。此时A需要再获得2才能继续执行,而B需要再获得1才能继续执行。
但1被A占有,2被B占有,两者互相阻塞,于是出现两个线程无休止等待的死锁状态。
2、死锁,就是指两个或多个线程出现永久性阻塞的状态。
3、一旦发生,则后果十分严重。再加上死锁的分析检测都很困难,不是每次运行都会发生。
所以我们在编程过程中,通过分析各种情况来发现和消除死锁,至关重要。
【专题:多线程编程】