2013-12-07 99 views
12

我正在學習C++ 11並遇到了線程問題。我的一般問題是:C++ 11互斥體是否與未使用C++ 11標準庫創建的線程兼容?C++ 11互斥體是否與不使用C++ 11創建的線程兼容?

我想安全地共享用C++ 11創建的線程和另一個由我無法控制的第三方庫創建的線程之間的信息。

例如,我的應用程序使用PortAudio,它爲音頻輸出創建自己的線程。我不確定它是使用pthreads還是OS特定的線程庫,但我確實知道PortAudio不是用C++ 11編寫的。我想在GUI線程(使用C++ 11線程)和使用互斥量的PortAudio線程之間安全地共享數據。

同樣,我可以使用C++ 11互斥鎖來同步QT QThreads和C++ 11線程嗎?

+0

呃,什麼是互斥代碼的其他位使用 ?你不能指望用多個不同的互斥體來保護單個資源。必須只是一個互斥體。 –

+0

目的是在不同類型的線程中使用單個互斥鎖。 – mjango

+0

由於您使用的是特定於實現的線程,因此標準不會對您有所幫助。但是肯定的是,在任何運行這些庫的平臺上,互斥鎖在任何線程上都可以正常工作。 –

回答

6

顯然,C++標準沒有對與其他系統的兼容性做任何​​保證。 C和C++標準增加了線程設施的部分原因是爲了在一個線程系統上實現標準化。

實際上,預計C和C++線程庫的構建是爲了與平臺線程系統集成(如果有的話)。例如,在使用pthread的平臺上,期望的是在適當的地方使用pthread來構建標準庫線程工具(據我所知,對於各種原子操作沒有pthreads接口,即標準庫可能需要提供它自己的同步原語)。

標準庫類通過native_handle()方法提供對底層表示的訪問。一個標準庫應該實現從這些返回的內容,例如,如果提供了pthread類型,假設這個特定的標準庫將與pthreads一起玩,似乎是安全的。

+1

並不真正相關。但是請注意,不需要'native_handle'存在,如果它存在,它的返回類型是實現定義的。總之:非常不便攜。 –

9

C++ 11互斥體是否與未使用C++ 11標準庫創建的線程兼容?

C++標準沒有將「線程」定義爲由C++標準庫專門創建的東西。

1.10多線程執行和數據爭[intro.multithread]

1執行(也稱爲線程)的線程是 控制的程序內的單個流,包括初始調用一個 特定的頂層函數,並遞歸地包含隨後由該線程執行的每個函數 調用。

所以,我會總結你的問題的答案是「是」。

2

C++ 11的線程實現與平臺的本地線程實現不兼容是不可思議的,因爲使用C++ 11線程的任何實際程序都將調用到平臺庫中,並且這些庫本身可能會被線程化或使與線程相關的調用(例如互斥體)。

線程的C++ 11庫實現當然不是必須使用高級本地線程庫(比如pthreads或windows線程),但它可能會爲此目的提供一個std :: thread :: native_handle()方法來獲得本地句柄。但是,即使它不使用高級本機實現,也必須使用下面的相同低級內核原語。

在所有可能的情況下,它應該因此是完全可以放心使用C++ 11互斥與本地庫調用創建的線程情況下,反之亦然,並混合其他任何天然或C++庫同步調用。確實有必要這樣做的情況。例如,C++ 11庫目前不提供線程池或讀寫鎖(共享互斥鎖)。您可能希望在使用std :: thread啓動的線程時使用本機讀寫鎖,或者使用C++程序中第三方庫提供的許​​多線程池實現之一。

要注意的唯一要注意的是,試圖混合使用不使用內核線程的線程庫的C++ 11線程(實際上它們會以某種方式使用內核線程,因爲上述原因) (例如,基於綠色線程或「用戶」線程的庫)可能會導致您陷入麻煩。

編輯:爲了支持這一點,我注意到C++ 11的第30.3節陳述了,儘管非規範性,「這些線程[std :: thread threads]旨在與操作系統一對一映射線程」。

3

的C++ 11標準規定,互斥鎖應當與任何種類的「執行代理」,包括不同線程庫的工作。下面是標準的一些相關的報價,我認爲決定性地回答這個問題:

互斥要求

互斥對象有助於防止數據競爭,並允許執行代理之間的數據 安全同步(30.2 .5)。一個 執行代理從擁有它成功地調用的鎖定功能之一 直到它調用解鎖時的互斥。

爲可鎖定的類型

一種執行代理要求是一個實體,如可在平行與其他執行代理執行工作 一個線程。 [注意:實現或 用戶可能會引入其他類型的代理,例如進程或 線程池任務。 - 結束語]呼叫代理由 上下文確定,例如,包含呼叫的調用線程,等等。

+0

這就是'Mutex'概念的定義。也就是說,任何帶有mutex-y接口的對象。它表示並不意味着'std :: mutex'支持任何類型的執行代理。 (它不) –

+2

@ R.MartinhoFernandes是啊?什麼樣的執行代理std :: mutex不起作用? – karadoc

+0

Erm,任何不使用實際物理線程的東西。 –