什么是更好的std :: lock_guard <std :: mutex> lock(std :: mutex mutex_var);或者std :: mutex mutex_var.lock();

时间:2016-11-15 06:08:31

标签: c++ mutex

我需要在函数内部锁定std :: map和两个boost :: multimaps的操作,因为我们有线程试图访问该函数(以及映射)。

我打算使用&#34; std :: mutex mutex_var&#34;保护操作它们的函数内的变量。所以我有&#34; std :: mutex mutex_var&#34;变量。我很困惑使用&#34; mutex_var.lock()&#34;在函数的开头和&#34; mutex_var.unlock()&#34;在函数的末尾(OR)只是在函数的开头使用std :: lock_guard?

为清楚起见,所有功能都是在互斥锁上添加内容。我也理解/我们不需要保护我们尝试查询地图的所有地方(因为它只是一个读取操作)。

请让我知道更好的选择,并且,请澄清我的阅读想法是否不需要保护是正确的。

TIA

-R

2 个答案:

答案 0 :(得分:2)

您应该(几乎)不要使用直接使用public ICommandstd::mutex::lock() std::mutex::try_lock()std::mutex::unlock()std::lock_guard与您的std::unique_lock。因为您不必编写解锁,因为它们在销毁时正在这样做。因此,即使在此期间引发了异常,您也不会忘记它。这就是所谓的RAII,这是现代C ++代码所需要的

所以mutex_var更好

还有

  

我也了解/不需要保护所有试图查询地图的地方

通常,您仍然必须保护该读取操作,因为您不知道何时有人要写入。但这取决于您的设计,整个问题被称为readers-writer-problem,并且由于您似乎没有意识到,所以我认为您的设计需要锁定所有步骤。

答案 1 :(得分:0)

  • 使用简单的互斥锁,如果所有线程都在读取线程,则不需要锁定资源。但是如果有一个或多个线程写入追索权,你需要锁定所有线程甚至是读取线程。
  • 有一种方法可以避免在没有写入线程时锁定资源,并在写入线程时锁定资源。您需要使用更复杂的锁定机制,您应该阅读有关openforread和openforwrite逻辑的内容。