CreateThread和_beginthreadex

來源:互聯網
上載者:User

在《Windows核心編程  5th》一書裡經常提到一個的建議,那就是:如果寫的是C/C++代碼,盡量不要用CreateThread來建立線程,而必須調用C/C++運行庫函數_beginthreadex。其中的原因摘自書上的原話就是:”標準C/C++運行庫不是為多線程應用程式而設計的。”。以全域函數和全域變數為例,在多線程環境中會問題。因為他們是多個線程訪問同一個資源,例如調用函數出錯後設定errno。為瞭解決這樣的問題,每個線程都需要它自己的errno變數,同時還必須有某種機制能夠讓一個線程引用自己的errno變數,同時不能讓它去修改另外一個線程的變數。

這種機制(線程局部儲存區?TLS?)就是在建立線程的同時,必須建立一個資料結構,並使之與使用了C/C++運行庫函數的每個線程關聯。然後,在調用C/C++運行庫函數時,那些函數必須知道去尋找主調線程的資料區塊,從而避免影響到其他線程。不過,從書上的原始碼可以看到,事實上在_beginthreadex的內部還是調用了CreateThread的,_beginthreadex所多作的工作就是分配一個_ptiddata類型的資料區塊並與線程相關等。

 

詳細可以參考《Windows核心編程  5th》P153-P162

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.