linux,windows如何避免競爭,同步控制的幾點經驗

來源:互聯網
上載者:User
 

linux,windows如何避免競爭,同步控制的幾點經驗
1) 避免使用全域變數,全域變數,指標傳遞必須特別小心,尤其是在核心;

2)採用訊號量,讀寫訊號量,自旋鎖,讀寫自旋鎖對共用的資料進行保護,訊號量當最大值為1時就相當於互斥量了;

3)如果要擷取多個鎖,必須以順序的方式獲得,比如有2個鎖,lock1和lock2,一個進程必須擷取這兩個鎖才能運行時,必須先擷取lock1,在擷取lock2,避免一個進程擷取了lock1,而另一個進程擷取了lock2,造成死結;

4)使用自旋鎖時,因為鎖被其它地方擷取,則會一直等待,並且重複檢查鎖,因此在使用自旋鎖時,自旋鎖必須在儘可能短的時間內擁有;另外,任何擁有自旋鎖的代碼應為原子的,它不能休眠;事實上,不能因為任何原因放棄處理器,但是現實中並不是這樣,所以必須小心使用;for example,許多核心功能都可以休眠,如使用者空間到核心空間copy資料,還有當我們獲得鎖的時候,此時產生了一個中斷,而中斷處理常式在返回前也要獲得這個鎖,這樣就死結了。

5)有時可以用迴圈緩衝區代替鎖,就像生產者消費者線程一樣,設定一個迴圈緩衝區和兩個移動的指標,就可以控制同步,這種方法在進程之間的通訊也可以使用;

6)線程之間的通訊可以使用mutex,semaphore,Event控制,其中semaphore,event可以和waitforsingleobject等函數一起使用,來控制2個線程通訊;mutex主要用在多個線程同時訪問共用資料時,進行保護;

7)windows多線程必須避免線上程中調用 MFC控制項等使用介面執行緒的東東,避免在程式退出時,由於使用介面執行緒已經退出,而工作者線程不能退出的情況,從而造成程式死掉。如果一定要使用這個東東,記得和  MsgWaitForMultipleObjects函數一起使用;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.