线程同步的⽅式?怎么⽤?

  1. 线程同步是指多线程通过特定的设置来控制线程之间的执⾏顺序,也可以说在线程之间通过同步建⽴起执⾏顺序的关系;

  2. 主要四种⽅式,临界区、互斥对象、信号量、事件对象;其中临界区和互斥对象主要⽤于互斥控制,信号量和事件对象主要⽤于同步控制;

  3. 临界区:通过对多线程的串⾏化来访问公共资源或⼀段代码,速度快、适合控制数据访问。在任意⼀个时刻只允许⼀个线程对共享资源进⾏访问,如果有多个线程试图访问公共资源,那么在有⼀个线程进⼊后,其他试图访问公共资源的线程将被挂起,并⼀直等到进⼊临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

  4. 互斥对象:互斥对象和临界区很像,采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以能保证公共资源不会同时被多个线程同时访问。当前拥有互斥对

  5. 象的线程处理完任务后必须将线程交出,以便其他线程访问该资源。

  6. 信号量:它允许多个线程在同⼀时刻访问同⼀资源,但是需要限制在同⼀时刻访问此资源的最⼤线程数⽬。在⽤CreateSemaphore()创建信号量时即要同时指出允许的最⼤资源计数和当前可⽤资源计数。⼀般是将当前可⽤资源计数设置为最 ⼤资源计数,每增加⼀个线程对共享资源的访问,当前可⽤资源计数就会减1 ,只要当前可⽤资源计数是⼤于0 的,就可以发出信号量信号。但是当前可⽤计数减⼩ 到0 时则说明当前占⽤资源的线程数已经达到了所允许的最⼤数目,不能在允许其他线程的进⼊,此时的信号量信号将⽆法出。线程在处理完共享资源后,应在离 开的同时通过ReleaseSemaphore ()函数将当前可⽤资源计数加1 。在任何时候当前可⽤资源计数决不可能⼤于最⼤资源计数。

  7. 事件对象:通过通知操作的⽅式来保持线程的同步,还可以⽅便实现对多个线程的优先级 ⽐较的操作。

Last updated