簡體   English   中英

如何在 C++ 中創建單進程互斥鎖?

[英]How to create a single process mutex within C++?

因此,我正在閱讀有關監視器與互斥鎖的內容,並發現有人提到監視器是更快的互斥鎖,因為它們不會鎖定系統范圍,而只會鎖定給定進程的線程。

C++ 中有什么方法可以完成或模擬這個嗎?

編輯:我現在很好奇系統范圍的互斥鎖和僅限於特定進程的互斥鎖之間有什么區別。

C++ 標准沒有定義系統范圍和每個進程的原語。 所以 C++ 沒有指定std::mutex是否是系統范圍的。

合理的實現具有高效的每進程std::mutex 要擁有系統范圍的互斥鎖,您需要為您的平台使用庫或操作系統對象

不同之處在於每個進程的互斥鎖可以使用任何 memory 操作來避免系統調用,因為進程 memory 在進程的線程之間共享。 memory 上的原子操作更有效,並且通常通過它們避免系統調用。 系統范圍的互斥鎖要么從系統調用開始(效率不高),要么必須使用共享的 memory(可能不安全,也可能有一些開銷)。

更新,在研究相關內容時偶然發現了這個問題的答案。

在 Windows 上,關鍵部分可用於單個進程而不是系統范圍的互斥鎖,並且通常更快:

編輯:雖然上述陳述是正確的,但 c++ 沒有系統范圍的 mutex概念。 此概念僅在使用操作系統特定原語(例如 win32 CreateMutex)時存在,並且與 std c++ 無關。

資料來源: 與 win32 CRITICAL_SECTION 相比的 std::mutex 性能

在 Linux、pthreads 上用於進程。

@Alex Guteniev 的答案盡可能准確(應該被認為是公認的答案)。 它指出 c++ 標准沒有定義系統范圍的概念,並且所有實際用途的互斥鎖都是每個進程,即用於單個進程中線程(執行代理)之間的同步(因此根據您的需要)。 C++ 清楚地說明了線程(std::thread)是什么(33.3 -...旨在與操作系統線程一對一的 map(在我的草稿中,至少...N4687))。 Microsoft post VC2015 已改進其實現以使用 windows 原語,如此所述。 在最受好評的答案中也有說明。 我還查看了 microsoft 和 (AFAICT) 的boost 庫實現(通常先於/影響 c++ 標准),它不使用任何進程間調用。

所以回答你的問題。 在 C++ 中,如果 這個定義被認為是准確的,線程和監視器實際上是相同的。

暫無
暫無

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

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