首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是更好的std::lock_guard<std::mutex>锁( std::mutex mutex_var);还是std::mutex mutex_var.lock();

什么是更好的std::lock_guard<std::mutex>锁( std::mutex mutex_var);还是std::mutex mutex_var.lock();
EN

Stack Overflow用户
提问于 2016-11-15 06:08:30
回答 2查看 1K关注 0票数 0

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

我计划使用一个"std::mutex mutex_var“来保护那些操作它们的函数中的变量。所以我有"std::mutex mutex_var“变量。我混淆了函数开头使用"mutex_var.lock()“和函数末尾使用"mutex_var.unlock()”--只是在函数的开头使用std::lock_guard?

为了清晰起见,函数所做的就是在互斥体上添加内容。我也明白,我们不需要保护所有试图查询地图的地方(因为它只是一个读取操作)。

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

提亚

-R

EN

回答 2

Stack Overflow用户

发布于 2018-08-31 11:26:14

您应该(几乎)不要直接使用 std::mutex::lock()std::mutex::try_lock()std::mutex::unlock(),总是在mutex_var中使用std::lock_guardstd::unique_lock。因为你不需要写解锁,因为当他们被摧毁时,他们就会这么做。所以您不能忘记这一点,即使同时抛出了异常。这被称为https://en.cppreference.com/w/cpp/language/raii,是现代C++代码所需要的。

所以std::lock_guard 是更好的

而为了

我也明白,我们不需要保护所有我们试图查询地图的地方

通常,你仍然需要保护读操作,因为你不知道什么时候有人想写。但这取决于您的设计,整个问题被称为读者-作家-问题,而且由于您似乎不知道这一点,所以我假设您的设计需要在所有步骤中锁定。

票数 2
EN

Stack Overflow用户

发布于 2016-11-15 07:15:55

  • 使用简单的互斥锁,如果所有线程都在读取线程,则不需要锁定资源。但是,如果在写入追索权的线程中有一个或多个线程,则需要锁定所有线程,甚至是读取线程。
  • 有一种方法可以避免在没有写入线程的情况下锁定资源,并在一个写入线程时锁定资源。您需要使用更复杂的锁定机制,您应该阅读openforread和openforwrite逻辑。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40603142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档