我發現這一點: Fast interprocess synchronization methodpthread互斥體在共享內存中是否可以跨線程工作?
我曾經相信,一個並行線程互斥體只能被兩個線程在同一地址空間共享。
問題/答案似乎暗示:
如果我有兩個獨立的proceses一個& B.他們有一個共享內存區域M.我可以把米的並行線程互斥鎖A,鎖定B,在A解鎖;而B將不再阻塞互斥體。它是否正確? pThread互斥鎖可以在兩個獨立的進程中共享嗎?
編輯:我在MacOSX上使用C++。
我發現這一點: Fast interprocess synchronization methodpthread互斥體在共享內存中是否可以跨線程工作?
我曾經相信,一個並行線程互斥體只能被兩個線程在同一地址空間共享。
問題/答案似乎暗示:
如果我有兩個獨立的proceses一個& B.他們有一個共享內存區域M.我可以把米的並行線程互斥鎖A,鎖定B,在A解鎖;而B將不再阻塞互斥體。它是否正確? pThread互斥鎖可以在兩個獨立的進程中共享嗎?
編輯:我在MacOSX上使用C++。
我很擔心,因此可能會出現在共享內存中的互斥體可能無法正確行爲的條件,所以我做了一些挖掘和一些文件,它把這個問題就像一個沒有腦子想出了:
https://computing.llnl.gov/tutorials/pthreads/
進一步深挖,然而,表明舊版本的glibc的共享內存互斥遭遇的問題:(這是一個古老的變化,但它說明了這一點。)
in linuxthreads/mutex.c
int __pthread_mutexattr_setpshared(...) {
/* For now it is not possible to shared a conditional variable. */
if (pshared != PTHREAD_PROCESS_PRIVATE)
return ENOSYS;
}
沒有更多的細節你正在使用哪種pthread的實現,很難說你是否安全。我很關心的是,許多實現(以及一些完整的語言,如perl,python和ruby)都有一個全局鎖對象,用於管理對共享對象的訪問。這個對象不會在進程之間共享,因此,雖然您的互斥鎖可能大部分時間都在工作,但您可能發現自己有兩個進程同時處理互斥鎖。
我知道,這蒼蠅在一個互斥體的定義的臉,但它是可能的:
如果兩個線程都在不同的進程同時運行,這意味着它們是在不同的內核。兩者都獲得它們的全局鎖對象並去操作共享內存中的互斥鎖。如果pthread實現強制通過緩存更新互斥鎖,則兩個線程都可能同時更新,兩者都認爲它們持有互斥鎖。這只是一個可能出現的故障向量。可能有其他許多人。你的情況的具體情況是什麼 - 操作系統,pthreads版本等?
你的鏈接是標準的pThread文檔。它是如何讓這個問題變得不容易呢? – anon 2010-03-05 21:52:57
如果你的C /並行線程庫符合,你應該能夠判斷它通過如果_POSIX_THREAD_PROCESS_SHARED
功能測試宏定義爲比-1
以外的值或在查詢系統配置檢查支持在多個進程共享的互斥運行時使用sysconf(_SC_THREAD_PROCESS_SHARED)
如果該功能測試宏是undefined。
編輯:作爲Steve pointed out,您需要顯式配置跨進程共享的互斥鎖,前提是平臺支持上述功能。
請注意,操作系統實現有時可以將'_POSIX_THREAD_PROCESS_SHARED'定義爲正數,但實際上並未實現(因爲POSIX表示它是可選的)。請參閱https://github.com/boostorg/interprocess/blob/4f8459e868617f88ff105633a9aa82221d5e9bb1/include/boost/interprocess/detail/workaround.hpp#L45瞭解如何應對這種情況。 – Anon 2017-02-21 05:17:48
你需要告訴互斥體是進程共享的,當它inited:特別
http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html
注「的屬性的默認值是PTHREAD_PROCESS_PRIVATE」,這意味着從不同的進程訪問它是未定義的行爲。
OP的相關問題:http://stackoverflow.com/questions/2389307/on-macosx-in-c-how-to-do-interprocess-communication-over-shared-memory-withou – Void 2010-03-06 00:14:24