當前位置:編程學習大全網 - 編程語言 - 線程編程的線程同步

線程編程的線程同步

即當有壹個線程在對內存進行操作時,其他線程都不可以對這個內存地址進行操作,直到該線程完成操作,

其他線程才能對該內存地址進行操作,而其他線程又處於等待狀態,目前實現線程同步的方法有很多,例如:臨界區(critical section)、事件(event)、信號量(semaphore)、互斥量(mutex)。

1、臨界區:通過對多線程的串行化來訪問公***資源或壹段代碼,速度快,適合控制數據訪問。在任意時刻只允許壹個線程對***享資源進行訪問,如果有多個線程試圖訪問公***資源,那麽在有壹個線程進入後,其他試圖訪問公***資源的線程將被掛起,並壹直等到進入臨界區的線程離開,臨界區在被釋放後,其他線程才可以搶占。

2、互斥量:采用互斥對象機制。 只有擁有互斥對象的線程才有訪問公***資源的權限,因為互斥對象只有壹個,所以能保證公***資源不會同時被多個線程訪問。互斥不僅能實現同壹應用程序的公***資源安全***享,還能實現不同應用程序的公***資源安全***享

3、信號量:它允許多個線程在同壹時刻訪問同壹資源,但是需要限制在同壹時刻訪問此資源的最大線程數目

4、事 件: 通過通知操作的方式來保持線程的同步,還可以方便實現對多個線程的優先級比較的操作

臨界區對象

定義在數據段中的壹個SECURITY_ATTRIBUTES結構體,Windows內部使用這個結構記錄壹些信息,確保在同壹時間只有壹個線程訪問該數據段中的數據。

臨界區的使用步驟

1.初始化壹個SECURITY_ATTRIBUTES結構,在臨界區對象之前,需要定於全局SECURITY_ATTRIBUTES結構體變量,在調用CreateThread函數前調用InitializeCriticalSection(LPC RITICAL_SECTION lpCriticalSection)函數初始化臨界區對象。

2.申請進入壹個臨界區。在線程函數中要對保護的數據進行操作前,可以通過調用 EnterCriticalSection(LPC RITICAL_SECTION lpCriticalSection)函數申請進入臨界區,由於在同壹時間內,只允許壹個線程進入臨界區,所以在申請的時候如果有壹個線程進入到臨界區,則該函數就會壹直等到那個線程執行完臨界區代碼。

3.離開臨界區。當執行完臨界區代碼後,需要調用LeaveCriticalSection(LPC RITICAL_SECTION lpCriticalSection)函數吧臨界區交還給系統。

4.刪除臨界區,當不需要臨界區是可以調用DeleteCriticalSection(LPC RITICAL_SECTION lpCriticalSection)函數將臨界區對象刪除。

  • 上一篇:日本第二眼
  • 下一篇:學完了C基礎,不知道應該學什麽了~
  • copyright 2024編程學習大全網