線程同步

線程同步

線程同步,就是協同步調,按預定的先後次序進行運行。即當有一個線程在對內存進行操作時,其他線程都不可以對這個內存地址進行操作,直到該線程完成操作, 其他線程才能對該內存地址進行操作,而其他線程又處於等待狀態。如:你說完,我再說。“同”字從字面上容易理解為一起動作其實不是,“同”字應是指協同、協助、互相配合。如進程、線程同步,可理解為進程或線程A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B運行;B依言執行,再將結果給A;A再繼續操作。所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回,同時其它線程也不能調用這個方法。

實現線程同步的方法有很多,臨界區對象就是其中一種。

舉例說明


Java裡面,通過synchronized進行同步的保證。例如:
C++ 11裡面,通過std::mutex的加鎖和解鎖來保證。例如:

方式和機制


臨界區、互斥量、事件、信號量四種方式
臨界區(Critical Section)、互斥量(Mutex)、信號量(Semaphore)、事件(Event)的區別
1、臨界區:通過對多線程的串列化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。在任意時刻只允許一個線程對共享資源進行訪問,如果有多個線程試圖訪問公共資源,那麼在有一個線程進入后,其他試圖訪問公共資源的線程將被掛起,並一直等到進入臨界區的線程離開,臨界區在被釋放后,其他線程才可以搶佔。
2、互斥量:採用互斥對象機制。只有擁有互斥對象的線程才有訪問公共資源的許可權,因為互斥對象只有一個,所以能保證公共資源不會同時被多個線程訪問。互斥不僅能實現同一應用程序的公共資源安全共享,還能實現不同應用程序的公共資源安全共享
3、信號量:它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目
4、事 件:通過通知操作的方式來保持線程的同步,還可以方便實現對多個線程的優先順序比較的操作