簡體   English   中英

共享內存中的std :: mutex無法正常工作

[英]std::mutex in shared memory not working

我有一個場景,其中兩個不同的進程專門訪問共享內存區域。 當我啟動進程時,第一個進程成功鎖定了互斥鎖,更新了內存並解鎖了互斥鎖。 但是我觀察到,當第二個進程嘗試鎖定它時,它仍處於死鎖狀態,等待互斥鎖解鎖。

互斥鎖之間的時間差在第一個和第二個過程中為10s。

我正在使用std :: mutex。 請告訴我我所缺少的。

std :: mutex實例僅適用於單個進程; 它不能進行進程間同步/並發。 它僅能夠同步父進程中的子線程。

看起來可以使用Boost或進程間同步庫。

std :: mutex不支持進程間操作,但是pthread庫具有可以使用的進程間互斥量。 這里的例子。

盡管有人引用了文檔,但在Linux上的共享內存中使用std::mutexstd::shared_mutex 實際上可以跨進程工作 我已經檢查了GCC 8.3.1和Clang 6.0.1。

這些在Linux上的標准C ++實現使用pthreads。 std::mutexstd::shared_mutex提取並默認使用PTHREAD_PROCESS_SHAREDPTHREAD_PROCESS_PRIVATE的pthread作為pthread_mutex_tpthread_rwlock_t屬性。 即使POSIX文檔說默認值是PRIVATE,在共享內存中分配的pthread_mutex_tpthread_rwlock_t在鎖定時也會阻塞競爭的進程。 這是因為pthread在Linux上的實際實現使用futex ,並且即使在映射地址可能在各個進程之間不同的情況下,它們也打算用於共享內存中。

考慮到使用futexes實現互斥鎖的策略,PTHREADS_PROCESS_PRIVATE行為實際上可能更難以實現,因此,沒有實現。

如果確實希望互斥鎖是進程專用的,則只需避免將它們放在共享內存中。 另一方面,如果您確實希望共享它們,則請注意,此標准差異可能會有所更改。

為了提高可靠性,請使用Boost Interprocess

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM