临界区(Critical Section)(同一个进程内,实现互斥)
保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只容许一个线程对共享资源进行访问。若是有多个线程试图同时访问临界区,那么在有一个线程进入后其余全部试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其余线程能够继续抢占,并以此达到用原子方式操做共享资源的目的。
互斥量(Mutex)(能够跨进程,实现互斥)
互斥量跟临界区很类似,只有拥有互斥对象的线程才具备访问资源的权限,因为互斥对象只有一个,所以就决定了任何状况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其余线程在得到后得以访问资源。互斥量比临界区复杂。由于使用互斥不单单可以在同一应用程序不一样线程中实现资源的安全共享,并且能够在不一样应用程序的线程之间实现对资源的安全共享。
互斥量与临界区的做用很是类似,但互斥量是能够命名的,也就是说它能够跨越进程使用。因此建立互斥量须要的资源更多,因此若是只为了在进程内部是用的话使用临界区会带来速度上的优点并可以减小资源占用量。
信号量(Semaphores)(主要是实现同步,能够跨进程)
信号量对象对线程的同步方式与前面几种方法不一样,信号容许多个线程同时使用共享资源,这与操做系统中的PV操做相同。它指出了同时访问共享资源的线程最大数目。它容许多个线程在同一时刻访问同一资源,可是须要限制在同一时刻访问此资源的最大线程数目。通常是将当前可用资源计数设置为最大资源计数,每增长一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就能够发出信号量信号。可是当前可用计数减少到0时则说明当前占用资源的线程数已经达到了所容许的最大数目,不能在容许其余线程的进入,此时的信号量信号将没法发出
事件(Event)(实现同步,能够跨进程)
事件对象也能够经过通知操做的方式来保持线程的同步。而且能够实现不一样进程中的线程同步操做。安全