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

c++ - “嵌套”作用域锁

我缩短的简化类如下所示:

我想同步访问m_myVar. 调用A::methodB()时,线程两次进入同一个互斥锁的锁,明显阻塞在第一行。A::methodA()

有什么办法可以在再次通过时scoped_lock不阻塞同一个线程

当然,我可以调用m_mutex.unlock(). 但这也会释放等待锁的其他线程——这绝对不是我想要的。

任何的想法?

最好的问候托比亚斯

0 投票
2 回答
2404 浏览

c++ - 不能使用 boost::shared_mutex

我有一个带有类型非静态成员的小模板类boost::shared_mutex。每当我尝试编译它时,我都会收到错误消息:

'boost::shared_mutex::shared_mutex' : cannot access private member declared in class 'boost::shared_mutex'.

boost::shared_mutex确实有一个私有嵌套类shared_mutex,但我不明白为什么会出现这个问题。

这是我的课:

常规的 `boost::mutex' 也会发生同样的情况。

我有另一个非模板类,在其中使用任何一种互斥锁类型都没有问题。

0 投票
0 回答
105 浏览

c++ - 使用 boost 线程的 MSVC++ 6.0 中的自定义串行服务器类中的访问冲突

我有一个应用程序需要能够接受来自以太网、串行端口和/或 GUI 的命令,处理它们,然后通过以太网和串行通道输出结果。主机操作系统是 Windows NT4.0,所以我仅限于 MSVC++ 6.0 和 Boost 库版本 1.34.1。我创建了一个类来充当串行端口服务器。在单独的线程中,调用类的构造函数,打开端口并获取句柄。然后,它的函数“ProcessMessages”被调用,它不断地监视串行端口的传入消息。

处理完一条消息后,我需要将结果写入串口。每当我尝试使用串行端口的句柄时,都会遇到访问冲突。我想我需要使用互斥锁,但我找不到任何适合我独特情况的增强互斥锁的好例子。有人有什么想法吗?

0 投票
1 回答
1900 浏览

c++ - 从析构函数中释放 boost::mutex

由于std::vector不是线程安全的,我试图围绕它构建一个非常简单的封装,使其成为线程安全的。

这工作得很好,但有一个小问题。当类的实例被破坏并且另一个线程仍在尝试从中读取数据时,该线程将永远挂在boost::mutex::scoped_lock lock(m_mutex);

我怎么能解决这个问题?最好的办法是解锁互斥锁,以便挂在其中的线程可以继续执行。我还没有定义析构函数,因为到目前为止,它不是必需的。

这是我的代码。请注意,这里显示的方法比这里显示的要多,它已被简化。

编辑我必须改变我的定义。如前所述,容器显然不是线程安全的。它不应该这样做——即使命名法具有误导性。当然你可以用它做一些根本不是线程安全的事情!但是只有一个线程写入容器,2 或 3 个线程从中读取。在我尝试停止该过程之前,它运行良好。我不得不说显示器会更好。但是时间不多了,在那之前我无法改变这一点。

任何想法表示赞赏!谢谢并恭祝安康。

0 投票
2 回答
983 浏览

c++ - 矢量复制和多线程:即使偶尔发生写入,如何确保多读取?

该程序是多线程的。虽然可以搜索多个线程,但矢量复制仅由单个线程完成,但有时会发生。问题是无论如何,vector_search 不应该失败。Vector_copy 可以延迟,但 vector_search 不应该。它是一个没有延迟,没有失败的模式。问题是共享变量 vectora 必须是持久的,因此 vector_search 根本不会失败。实现这一目标的最佳方法是什么?

编辑 :

使用另一个问题的答案

如果具有可升级所有权的线程尝试升级而其他线程具有共享所有权,则尝试将失败并且线程将阻塞,直到可以获得独占所有权。 --boost 文档

诀窍是矢量复制是异步完成的,它将在获得独占所有权后发生。所以向量复制最终会发生,但延迟了,实际上向量复制也是一个非失败操作,但延迟了,这对我来说没问题。会有一个锁以某种方式进行同步,我们将至少阻塞一毫秒。但是使用这种交换的优势将导致它的时间更短,可以忽略不计。

0 投票
1 回答
1254 浏览

c++ - Boost named_mutex 无法在不同用户创建的进程之间共享

我在跨进程共享名为 mutex 的 boost 时遇到问题,这些进程由不同的用户创建。第一个进程是由服务创建的,它以 LocalSystem 身份登录。第二个进程是我自己创建的(正常执行进程即可)。

两个进程都运行这个函数(C++):

目前,我观察到两个进程都能够同时进入 DoSomeWork() 。只有当服务以“我自己”身份登录,然后我以管理员身份运行第二个进程时,才会出现此问题。

有没有办法通过提升或一些简单的代码来解决这个问题,而不是这个? http://support.microsoft.com/kb/193073

(我尝试将互斥锁名称设置为“Global\mymutex”,但无法创建互斥锁)(我也尝试使用 Windows CreateMutex(),但它也遇到了同样的问题,如 kb193073 中所述)

谢谢!

西蒙

0 投票
5 回答
4570 浏览

c++ - 手动释放升压锁?

为了学习 boost::thread 的组合,我正在为锁定公共互斥锁 (M) 的线程实现一个简单的屏障 (BR)。但是,据我在去 BR.wait() 时得到的,互斥锁上的锁没有被释放,所以为了让所有线程到达 BR,需要手动释放 M 上的锁。所以我有以下代码:

而 M.unlock() 显然是一个糟糕的解决方案(不使用锁);那么如何(简单地)释放锁?另外:我如何(正确地)在 main() 中等待所有线程完成?(TH2.join() 不好,因为 TH2 可能会先完成...);

请不要建议复飞,例如使用我也可以使用的条件变量,但必须可以在没有它们的情况下直接进行。

0 投票
0 回答
507 浏览

c++ - boost::lock_guard 永远等待

我正在多线程环境中使用升压互斥锁和锁在 C++ 中开发 LRU 缓存。该架构基于 boost::unordered_map + lock-free-queue 插入以非阻塞模式 (try_lock) 工作,但删除应锁定映射并继续。问题是,在清除过程中,缓存访问死锁很少见。

。H

.cpp

你能解释一下有什么问题吗?我几乎可以肯定它在删除过程中会死锁,因为它是它必须获取的唯一锁。

谢谢大家

编辑:我在运行 mpm_prefork_module 的 apache 模块中使用此缓存:这可能是问题吗?我应该使用 boost::interprocess 而不是 boost::thread 吗?

0 投票
1 回答
943 浏览

c++ - 与 boost::interprocess_mutex 相比,为什么不在共享内存中使用 boost::mutex?

现在已经有一段时间在愤怒中学习和使用提升共享内存,我已经得出了一个心智模型,什么时候使用什么类型的互斥锁,看起来像这样:

我希望我原则上没有弄错,所以如果是这样,请纠正我。我的意图是推进和纠正现有代码以及我自己的不符合这张图片但我想确定的代码。

这个问题的两个部分:我认为它确实没问题,但使用 //2 毫无意义 - 在上下文中这不如 //1 好,但原因是什么?表现?

对于 //3,我猜对了吗?有人可以给出它不起作用的技术幕后原因,或者至少在什么情况下它不起作用?

0 投票
1 回答
1943 浏览

c++ - 类中的 Boost::Mutex 不是线程安全的

我正在学习并发编程,我想做的是有一个类,它负责运行自己的 Boost:Thread 的每个对象。我对这段代码有点不知所措,因为它使用了很多我不太熟悉的功能(动态分配的内存、函数指针、并发等)。就像每一行代码我都必须检查一些参考资料才能让它正确。

(是的,所有分配的内存都包含在实际代码中!)

我在使用互斥锁时遇到了问题。我将它声明为静态,并且它似乎为所有实例获得了相同的值(应该如此)。该代码仍然不是线程安全的。

互斥锁应该阻止线程(对吗?)继续前进,以防其他人锁定它。因为互斥锁是有范围的(一种简洁的功能),并且它在 if 语句中应该查看其他线程,不是吗?我仍然得到控制台输出,这清楚地表明它不是线程安全的。

另外我不确定我是否使用了静态变量。我尝试了不同的引用方式(Seller::ticketSaleMutex),但唯一有效的是“this->ticketSaleMutex”,它看起来很阴暗,似乎违背了它是静态的目的。

卖家.h:

卖家.cpp:

主.cpp: