线程同步的方法一般有以下几种,vc下实现方法有sdk, 和MFC封装类两种
1临界区(Critical Section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2互斥量(Mutex):为协调共同对一个共享资源的单独访问而设计的。
3信号量(Semaphores):为控制一个具有有限数量用户资源而设计。
4事 件(Event):用来通知线程有一些事件已发生,从而启动后继任务的开始。
区别与联系:
1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。
(其它3种方式相当有独占资源,而信号灯可以对资源使用量进行计数)
互斥量(Mutex),信号灯(Semaphore),事件(Event)作为内核对象,可以在多个进程的线程间进行同步,但耗费资源较多。
临界区耗费资源较少,在同一个进程同的多线程程序应该首选之。
但应该注意到,当有多个临界区时,要注意死锁的发生。因为临界区无法设置等待超时。