问题标签 [boost-mutex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
201 浏览

c++11 - 锁定 Mutex 但不要等待它被解锁

我将如何在我的方法开始时锁定一个std::mutex左右boost::mutex,我会锁定它,但不管它已经被锁定还是不只是继续执行代码。

我想要这种行为,因为将有 2 个线程读取和写入std::map. 当它正在读取时,我只想锁定互斥锁,以便它可以继续读取但写入停止。当它正在写入时,我希望它锁定另一个互斥锁,这将阻止读写,并等待两个互斥锁都被解锁,以便它可以单独使用地图。

0 投票
2 回答
1503 浏览

c++ - 延迟锁和`boost::lock`

我正在阅读 lock_guard 和 unique_lock 之间的区别,我发现 unique_lock 是 lock_guard 的增强版本。这样使用唯一的锁就可以始终延迟锁。我在阅读这篇文章时遇到了 boost::lock。我想知道如何使用这种方法。我尝试了以下方法:

如果有人能向我解释 boost::lock 的作用以及它是如何工作的,我将不胜感激。谢谢

0 投票
2 回答
1063 浏览

c++ - 如何*先*获得排他锁,然后在不释放锁的情况下降级为共享锁

Stack Overflow 有几个例子,其中函数首先获得可升级锁,然后通过升级获得独占访问。我的理解是,这可以会导致死锁,因为两个线程可能都获得可升级/共享锁,然后都尝试升级,此时两个线程都无法继续,因为另一个线程具有共享锁。

我想要的是先获得独占锁,然后在不完全释放锁的情况下降级为共享锁。我找不到这样的例子。有任何想法吗?

0 投票
0 回答
1177 浏览

c++ - boost::mutex 的破坏在类析构函数中失败

首先:我已经阅读了许多关于此错误发生的帖子(例如boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed),我可以看到它们不适用于我的情况。

此外,我不能像那些帖子中经常建议的那样使用 RAII。

此外,我不能给出“最小编译示例”,因为那里不会发生此错误。

我的问题: 我在一个代表 FIFO 列表的类中有两个互斥锁,互斥锁用于锁定锚指针和反向指针。

在那一刻,当类被破坏时,在已经被破坏back_mutex之后的破坏失败anchor_mutex。这是错误信息:

POSIX-Specpthread_mutex_destroy说失败的唯一两种情况是EINVAL,如果互斥锁无效,以及EBUSY如果互斥锁被锁定或引用。

由于这些知识,我将我的析构函数更改为以下测试:

尽管如此,错误仍然存​​在于同一位置。正如我建议的那样,如果两种情况之一EINVALEBUSY相关,互斥锁的锁定和解锁应该失败。我也可以保证调用析构函数的线程是所有其他线程之前加入的最后一个活线程。

作为附加测试我在push_back和pop_front的第一行写了一个return,那么错误就不会发生了。仅使用 push_back 时也会发生

对于“某种”完整性,使用 push_back 和 pop_front 方法中的互斥锁的代码:

问题: “正常工作”的互斥锁怎么可能在被破坏时失败?还是我在这里监督一些事情?我怎样才能摆脱这个错误?我在代码和假设中做错了什么?

0 投票
2 回答
510 浏览

c++ - (提升)unique_lock 与 conditional_variable 一起使用时的开销

为什么 a 的wait()方法boost::conditiona_variable需要一个boost::unique_lock对象作为参数而不是简单的boost::mutex

实际上,unique_lock 的用途并不完全清楚。为什么要在我的 周围创建另一个包装器对象boost::mutex,对性能有什么影响?

例如,假设我有两个线程,thread1并且thread2

thread1

thread2

unique_lock在这种情况下,我发现每次需要调用wait()条件变量的方法时都创建新对象是很浪费的。您能否告诉我这些对象的目的以及它们是否会引入大量开销?

谢谢!

(我看到我的问题与这个问题重叠,但我更关心的是开销而不是目的......)

0 投票
2 回答
1793 浏览

c++ - 如何在 C++ 中限制运行实例的数量

我有一个分配大量内存的 c++ 类。它通过调用一个第三方库来做到这一点,如果它无法分配内存,它会崩溃,有时我的应用程序会在并行线程中创建我的类的多个实例。线程太多我崩溃了。对于解决方案,我最好的想法是确保永远不会有超过三个实例同时运行。(这是一个好主意吗?)而我目前最好的实现方法是使用boost mutex。类似于以下伪代码的内容,

如您所见,我不太确定互斥锁的确切语法。所以总结一下,我的问题是

  1. 当我想通过限制线程数来解决内存错误时,我是否走在正确的轨道上?
  2. 如果是,我应该使用互斥锁还是其他方式?
  3. 如果是,我的算法是否合理?
  4. 有没有一个很好的例子来说明如何将 try_lock 与 boost 互斥锁一起使用?

编辑:我意识到我在谈论线程,而不是进程。编辑:我参与构建一个可以在 linux 和 Windows 上运行的应用程序......

0 投票
1 回答
68 浏览

c++ - 使用firebreath插件防止浏览器关闭

我有一个插件,我想防止浏览器关闭,因为我保存了一些需要未知随机时间的数据。

提示询问保存数据的位置,但之后立即崩溃,我猜是锁。如何让浏览器等待用户完成保存数据?

0 投票
2 回答
4426 浏览

c++ - 如何将 lock_guard 与 try_lock_for 一起使用

我可以boost::lock_guard用来获取boost::mutex对象上的锁,这种机制将确定一旦boost::lock_guard超出范围,锁将被释放:

在这种情况下,a_mutex无论代码块是否被异常退出,都会被释放。

另一方面, aboost::timed_mutex也支持方法try_lock_for(period),例如

如果语句块因异常退出,unlock()则此代码不会。a_timed_mutextrueif

问题: Boost(据我所知,C++11 标准都不是)似乎没有提供lock_guardtry_lock()or一起使用的变体try_lock_for(period)。处理第二种情况的“推荐”方式或最佳实践是什么?

0 投票
1 回答
171 浏览

c++ - 在并行快速排序中提升互斥锁

这是我第一次使用互斥锁,所以我不确定我在做什么,但我认为我在使用向量容器的 push_back 函数的线程安全方面遇到了错误(我有多个线程同时写入它时间并出现此错误): *检测到 glibc * ./quicksort:双重释放或损坏(输出):0x00007f2638000980 *

为了解决这个问题,我添加了一个互斥体,但它似乎没有做任何事情,代码在这里:

0 投票
2 回答
1200 浏览

c++ - 等待互斥锁时的进程

有没有办法在等待互斥锁锁定时执行代码部分?

对我的应用程序性能唯一真正的内部影响是数据库交互,有时我需要严格同步,因为数据库交互可能会导致争用,所以我想利用等待锁的时间从数据库。

例如,我希望代码看起来像伪代码:

我检查了 boost 的同步部分,虽然futuresrecursive听起来我的意图可以实现,但我不知道如何实现我的意图。

我的意图如何实现?