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

c++ - Using boost::mutex::scoped_lock inside const function

This code won't compile:

But defining the function as non const will work fine. Please, can someone explain why? Thanks!

0 投票
1 回答
1287 浏览

c++ - 提升共享互斥锁检查是否锁定在同一个线程中

当我编写多线程算法时,我发现一些方法对预期互斥锁的状态很有用。对一些人来说,它已经被锁定,对一些人来说,它还没有。

我想出了如何断言互斥锁是否已经被锁定的方法:

问题是我如何才能断言检查互斥锁是否未锁定......从当前线程。例如,如果我这样做

它显然不时失败,只是因为其他一些线程已将其锁定。

0 投票
2 回答
320 浏览

c++ - Boost w/ C++ - 奇怪的互斥行为

我正在试验Boost线程,因为据我所知,我可以编写多线程Boost应用程序并在 Windows 或 Linux 中编译它,而pthreads我更熟悉的 . 严格用于 *NIX 系统。

我有以下示例应用程序,它是从另一个 SO 问题借来的



我通过以下方式在我的 Ubuntu 14.04 LTS 系统上安装了 Boost:

我通过以下方式编译上述代码:

我遇到了一些有趣的不一致之处。如果我设置了一个long ,比如1秒NAP_DURATION(几毫秒。1000000121NAP_DURATION

当我使用 编写类似的此类应用程序pthreads时,锁通常会在线程之间或多或少随机交替,因为另一个线程已经在互斥锁上被阻塞。


因此,对于问题:

  1. 这是预期的行为吗?
  2. 有没有办法控制这种行为,例如使作用域锁表现得像锁定操作排队?
  3. 如果 (2) 的答案是“否”,是否可以使用Boost条件变量实现类似的效果,而不必担心锁定/解锁调用失败?
  4. scoped_locks保证解锁吗?我正在使用 RAII 方法而不是手动锁定/解锁,因为显然解锁操作可能会失败并引发异常,我正在尝试使此代码可靠。

谢谢你。

澄清

我知道将调用线程置于睡眠状态不会解锁互斥锁,因为它仍在范围内,但预期的调度是:

  • Thread1 锁定,获取互斥锁。
  • Thread2 锁定、阻塞。
  • Thread1 执行,释放锁定,并立即尝试再次锁定。
  • Thread2 已经在等待锁,在 thread1 之前得到它。
0 投票
2 回答
134 浏览

c++ - C++ / boost::scoped_lock:缺少编译器警告

我想知道是否可以配置 c++ 编译器,以便在有人设置 scoped_lock 但忘记将其分配给变量时发出警告。

请参阅以下示例:

  • 案例 1.1 和案例 2.1 展示了 scoped_lock 的预期用途
  • 案例 1.2 是一个错误的使用,没有创建持有者变量。它被编译器正确检测为错误(mMutex 有一个先前的声明)
  • 案例 2.2 与案例 1.2 几乎相同的错误,但编译器没有检测到,也没有发出任何警告,尽管代码明显有问题,并且非常接近案例 1.2(当然互斥锁不起作用)。

请参见下面的代码,我已经使用 g++-4.8 和 Visual Studio 2010 对其进行了测试。它们都没有检测到故障案例 2.2。

有谁知道 case 2.2 编译的原因,以及为了让编译器将其检测为警告可以做些什么?

0 投票
1 回答
888 浏览

c++ - boost::named_mutex: 最后一个进程关闭时安全清理

我有一个资源需要保护在一个进程内以及跨多个进程的访问。我通过创建一个命名互斥体来管理这个boost::interprocess:named_recursive_mutex,它工作得很好。

但是,据我了解,这应该最终通过 清理remove(),即:

remove()但是,这个调用似乎完全破坏了互斥锁,而不是检查/减少引用计数,所以当我知道没有其他进程正在使用它时,我试图找到一种安全的方法来发出调用。我也可以通过 boost 创建一块共享内存,但这似乎也没有共享引用计数。

我在 SO 上发现了一个类似的问题,但接受的答案似乎不足以满足我的需求,因为它只是指“增强文档”,但没有明确指示何时remove()可以安全发布。

当我确定最后一个访问它的进程已经关闭或可能崩溃时,如何安全地清理这个命名的互斥锁?

谢谢你。

0 投票
1 回答
567 浏览

c++ - 错误:Boost_Mutex.exe 中 0x76f6f9d2 处的异常(第一次机会):0xC0000008:指定了无效句柄

我写了一个程序来测试多线程。在main函数thread t中创建了 a。in function D,即 in ,将创建thread t两个线程。该函数在. 在一个成员函数中会被调用。在一个成员函数中会被调用。tttttProcessthread tttProcessdoAnotherThingclass Datthread ttdoOneThing

当我调试这个程序时,出现了一个错误:An exception (first chance) at 0x76f6f9d2 in Boost_Mutex.exe: 0xC0000008: An invalid handle was specified.

有时会发生此错误而不是上面的错误:

谁能帮我解决这个问题并修改代码?

这些是我的代码:

“达.h”

“数据.cpp”

“主.cpp”

如果您对我的问题陈述有任何建议,请告诉我,我会修改它。谢谢

0 投票
0 回答
142 浏览

c++ - 在 c/c++ 中完全(纯)用户空间锁定的 boost 或 stl 类?

boost或std STL中是否存在任何类,它利用原子指令并实现仅在用户空间中运行的同步锁?我确信线程将通过这种实现连续旋转以获取锁,但这对我的用例来说很好。这样的示例实现之一是here。但这是非常简单的锁,只允许一个读者或一个写者。我期望应该允许使用单个写入器或多个读取器实现锁定。

0 投票
2 回答
2018 浏览

c++ - 提升进程间互斥锁崩溃而不是等待锁定?

我已经在这工作了好几天(甚至发布在 boost 论坛上),并且能够让第二个进程识别锁定的互斥锁似乎不起作用。请帮忙。这是代码:

一个常见的头文件:SharedObject.hpp

这是第一个程序:

这是第二个程序:


程序 1 工作正常。
程序 2 给出以下输出:

我首先运行 program1,它锁定互斥体并保持锁定 60 秒。在那段时间里,我运行程序 2 来查看它是否在等待锁,但它崩溃了。如何让程序 2 在互斥体上等待,直到程序 1 完成对共享内存的写入?

0 投票
1 回答
1179 浏览

multithreading - 为什么即使您拥有互斥锁,互斥锁 try_lock 也会返回 false?

考虑这个简单的代码:

代码打印的Can't use lock. 这是一个问题,因为在我的程序中,只有当线程对 lock 具有独占权时,我才需要执行异步操作。所以:

  1. 为什么当我拥有该互斥锁时 try_lock 返回 false?
  2. 如何创建仅由拥有锁的线程执行的代码块?
0 投票
1 回答
90 浏览

c++ - 如果线程对象声明为成员,则提升线程启动失败

我编写了一个名为 Task 的类,它封装了一个 boost::thread 并允许覆盖 run() 方法以在新创建的线程上做一些工作。

这是基类:

该类能够通过服务器类将事件发布到多个 http 会话,但这里不相关。一切正常,线程启动并成功发布事件,直到工作结束。这是一个工作片段:

这是恢复类:

现在我尝试将还原任务的工作拆分为 N 个子任务(Worker,也是任务的子类)。这里是恢复的新运行方法:

此代码失败,因为子线程的启动在尝试运行 Worker 类 run 方法时创建了一个 sigfault,因为它被报告为纯虚拟,而且尝试在 Task 基类上锁定互斥锁在此断言上失败:

直接创建一个 Worker 对象并启动它(对于恢复)不会产生任何问题!

乍一看,Restore run() 方法似乎在子线程之前结束,删除了 Worker 实例,然后在运行时调用基类(纯虚拟)并尝试访问已破坏的互斥体。(如果我在这里错了,请纠正我!)

使用调试器深入研究我发现的问题并非如此。问题似乎停留在 Worker 对象声明中,因为以下更改使代码可以正常工作:

我更喜欢在没有 new 运算符的情况下创建 Workers,因为在 Restore::run() 完成后我真的不需要让这些对象保持活动状态,并且我应该能够保证这些对象仍然存在,直到孩子们完成,因为线程加入(已通过调试器验证)。

谁能找到这里的瓶颈?

我已经能够找到一种方法来运行我的代码,但仍然缺少解决方案(但对我来说更重要的是这里的解释)。

最好的祝福