<tr id="lexrc"><thead id="lexrc"></thead></tr>
    <tr id="lexrc"></tr>
    1. 每日快看:初識互斥量

      來源: 嗶哩嗶哩 2023-07-01 22:56:00


      (資料圖)

      Case 0 :

      運行的結果大概率是字母和數字混合在一起被打印出來,并不會先打印完全部數字再打印字母。這是因為線程的執行并沒有確定的先后順序。

      Case 1 :

      當多個線程涉及到共享數據時,為了防止條件競爭和數據訪問沖突,需要用到互斥量(Mutex)。

      訪問共享數據前,將數據鎖住,在訪問結束后,再將數據解鎖。當一個線程使用特定互斥量鎖住共享數據時,其他的線程想要訪問鎖住的數據,都必須等到之前那個線程對數據進行解鎖后,才能進行訪問——這就是互斥量的作用。

      Case 0的優化:

      Case 1的優化:

      使用互斥量來保護數據,并不是僅僅在每一個成員函數中都加入一個std::lock_guard對象那么簡單,一個指針或引用,也會讓這種保護形同虛設。

      在上述代碼中,函數process_data使用std::lock_guard來創建一個互斥量的鎖保護區域,確保在同一時間只有一個線程可以訪問Data對象的內容。但是在boom函數中調用process_data函數時,content的引用被傳遞給了malicious_func函數,從而使得通過unprotected_content指針可以繞過互斥量的保護,直接修改Data對象的內容,如果此時有其他線程在訪問和修改Data對象,又將引發數據競爭和未定義的行為。

      Warning:切勿將受保護數據的指針或引用傳遞到互斥鎖作用域之外,無論是函數返回值,還是存儲在外部可見內存,亦或是以參數的形式傳遞到其他函數中去。

      關鍵詞:

      你可能會喜歡:

      四虎永久在线精品免费下载,无码精品亚洲日韩一区二区三区,与女小丹乱目录伦

      <tr id="lexrc"><thead id="lexrc"></thead></tr>
        <tr id="lexrc"></tr>