问题标签 [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 投票
1 回答
682 浏览

c++ - 使用 boost::mutex 作为类的私有成员

我有一个包含 boost::mutex 作为私有成员的类。当您调用其公共函数之一时,它会被锁定,并在函数退出时解锁。这是为了提供对对象内部的同步访问。

这个类并不是特别有用,但我只是在玩互斥锁和线程。

我有一个 main(),它还定义了另一个函数,该函数从类中弹出字符串并在线程中打印它们。它将重复 10 次,然后从函数返回。再一次,这纯粹是为了测试目的。它看起来像这样:

我不断得到的错误是 boost::mutex 是不可复制的。printTheStrings() 函数需要一个引用,所以我有点困惑为什么它试图复制对象。

我已经对此进行了一些阅读,并且我一直在阅读的一个解决方案是使 boost::mutex 成为对象的静态私有成员。但是,这违背了我的互斥锁的目的,因为我希望它基于对象而不是类变量。

这只是对互斥锁的不当使用吗?我是否应该重新考虑整个应用程序?

编辑:

我刚刚发现 condition_variable 应该更好地服务于我的目的,让线程等待直到双端队列中实际存在某些东西,然后再醒来从双端队列中弹出并打印它。我看到的所有示例都在全局范围内定义了这些互斥锁和 condition_variable 对象。这似乎非常......在我看来不是面向对象的。甚至直接来自 Boost 本身的示例也表明它是以这种方式完成的。这真的是其他人使用这些对象的方式吗?

0 投票
1 回答
78 浏览

c++ - 条件变量 notify 后的执行顺序

有两个线程(称为 T1 和 T2)通过 boost 条件变量和互斥锁相互同步,例如:

假设我可以保证 thread2 先来等待,然后 thread1 将执行通知。

我的问题是,code_block_a() 或 code_block_b() 将首先执行是否具有确定性?

0 投票
1 回答
915 浏览

c++ - 结构中 boost::mutex 的未定义引用

我想对我的 struct Cell的函数add使用 boost::mutex 。这是我在 Detector.h 中的结构的定义

我在Cell的向量上使用我的函数add in Detector.cpp 。

当我尝试编译它时,mutex_.lock() 和 mutex_.unlock() 出现未定义的引用错误。但是为什么它在我用类似的函数重载运算符 += 之前(以及当我调用 EnergyPrimary[cellID].energy += new_energy;)之前工作?

0 投票
0 回答
306 浏览

c++ - 模板结构内的互斥锁导致分段错误

为了在类之间交换数据,我使用一种“main-hub-class”,其他类可以从中访问数据。
现在,为了使这个线程安全,我想出了一个模板结构,它包含一个变量和一个 boost::shared_mutex 用于该变量:

在 .cpp 我试图这样使用它:

从gdb,我得到了错误

我究竟做错了什么?我的猜测是互斥锁没有初始化?但是我将如何(以及在​​哪里)这样做?

编辑

更新的代码示例,现在显示了我使用的所有内容,还对我描述的问题进行了测试:

数据交换.hpp:

数据交换.cpp:

主.cpp:

是否因为互斥锁未初始化而出现段错误?另外,我很确定它更早地工作,至少是第一种方式(没有结构)。

第二次编辑:
好的,现在一切正常。这是我的一个愚蠢的错误。这两种方法都可以完美地工作——只要一个初始化 DataExchange 对象。

0 投票
2 回答
387 浏览

c++ - 无法解释的行为 boost::scoped_lock

我写在 C++ 多线程 TCP 服务器上,用于使用 boost:scoped_lock 进行同步

连接到服务器客户端后冻结。

在 gdb 中,我在调用 boost::mutex::lock 后在 pthread_kill 中看到了更多线程

行 device.cpp:639 处的代码

pool_device 中的代码

为什么调用互斥锁线程终止后?我认为死锁不是这种行为的原因请帮助!

0 投票
5 回答
963 浏览

c++ - 在多线程进程中同步写入日志

我实现了一个 Logger,所以它可以像 ostream 一样使用。例如,如果有人想写入日志 - 他可以这样做:

日志将被写入屏幕、日志文件以及用户喜欢的任何其他来源(这不是问题)。

为了实现这个目标,我为 LOG 创建了一个宏:

和重载的运算符()和运算符<<:

问题是当我有多个线程在我的进程上运行时,打印可能会被剪切,因为上面示例行中间的线程之间的上下文切换(LOG << "hello world...")

使用互斥锁可能无济于事,因为 operator << 和 operator () 不是同一个函数。

这个问题有什么绝妙或简单的解决方案吗?

0 投票
0 回答
36 浏览

c++ - 在单个线程中拥有多个读取器锁

我有数据加上一个Lock = boost::shared_mutex. 我正在锁定数据访问

读卡器锁 ReadLock = boost::shared_lock<Lock>

作家锁 WriteLock = boost::unique_lock<Lock>

显然,可能有很多读者一次读取数据,而只有一个人在写入。但这里有一个问题:

单个线程可能在同一个互斥锁上具有多个读锁,因为它正在调用本身锁定数据的函数(使用 a ReadLock)。但是,正如我所发现的,这会导致互锁:

  • 线程 1 读取锁定数据 (Lock1)
  • 线程 2 使用写锁 (LockW) 等待
  • 线程 1 生成另一个读锁 (Lock2),而 Lock1 仍然存在

现在我得到一个锁,因为Lock2正在等待LockW退出,LockW正在等待Lock1,并且Lock1因为Lock2.

我不知道是否可以更改设计,使每个线程只执行一个ReadLock. 我相信拥有一个让Writers 挨饿的系统会解决我的问题。如何处理我的案件有通用的方法吗?

0 投票
1 回答
143 浏览

c++ - boost::mutex 发布 VS 调试构建

我正在构建一个基于 PCL 的应用程序,它使用 velodyne 的默认 PCL 抓取器代码,可以在此处看到。

当我在调试模式下构建我的应用程序时,它按预期工作,但在发布构建中,云正在跳过,我松动了一两个云。我缩小了一个事实,即互斥体存在一些我没有经验的问题。

这是接收我的云的回调,下面的部分是主要的

我无法弄清楚为什么发布与调试存在差异。有什么建议么?我使用 Visual Studio 2017 和 PCL 1.8.1。

0 投票
3 回答
492 浏览

c++ - 部分类的互斥锁

是否可以在类的一部分上使用互斥锁?

喜欢 :

然后使用正确的互斥锁执行正确的操作。我知道这在技术上是可行的,但我不知道它是否会导致问题。

0 投票
1 回答
526 浏览

docker - 提升 docker 容器中的命名互斥锁

在我们的项目中,我们使用了一些需要遵守复杂规则的网络库。其中之一是我们应该手动创建一些 int 标识,该标识应该在同一主机上的每个进程中是唯一的(它也应该在特定范围内,因此我们不能使用 UUID 之类的东西)。我们在同一主机上有 >1 个容器,因此我们的想法是在不同进程之间同步生成此身份。为此,我想使用 boost 中的命名互斥锁,但我不确定它是否可以在同一主机中的 docker 容器之间工作。有没有人在 docker 容器中使用命名互斥锁的经验?