繁体   English   中英

有什么更好的std :: lock_guard <std::mutex> 锁(std :: mutex Mutex_var); 或std :: mutex Mutex_var.lock();

[英]Whats better std::lock_guard<std::mutex> lock(std::mutex mutex_var); or std::mutex mutex_var.lock();

我需要在一个函数中锁定std :: map和两个boost :: multimaps的操作,因为我们有线程试图访问该函数(因此也访问了这些映射)。

我打算使用“ std :: mutex Mutex_var”来保护操作它们的函数中的那些变量。 因此,我有“ std :: mutex Mutex_var”变量。 我对在函数开头使用“ mutex_var.lock()”和在函数末尾使用“ mutex_var.unlock()”(或)感到困惑,只是在函数开头使用std :: lock_guard?

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

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

TIA

-R

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

所以std::lock_guard更好

而对于

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

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

  • 使用简单的互斥锁,如果所有线程都在读取线程,则无需锁定资源。 但是,如果写入请求资源的线程中有一个或多个,则需要锁定所有线程,即使是正在读取的线程也是如此。
  • 当没有写入线程时,有一种避免锁定资源的方法,而当写入线程是一个时,有一种锁定资源的方法。 您需要使用更复杂的锁定机制,您应该阅读有关openforread和openforwrite逻辑的文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM