问题标签 [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.
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!
c++ - 提升共享互斥锁检查是否锁定在同一个线程中
当我编写多线程算法时,我发现一些方法对预期互斥锁的状态很有用。对一些人来说,它已经被锁定,对一些人来说,它还没有。
我想出了如何断言互斥锁是否已经被锁定的方法:
问题是我如何才能断言检查互斥锁是否未锁定......从当前线程。例如,如果我这样做
它显然不时失败,只是因为其他一些线程已将其锁定。
c++ - Boost w/ C++ - 奇怪的互斥行为
我正在试验Boost
线程,因为据我所知,我可以编写多线程Boost
应用程序并在 Windows 或 Linux 中编译它,而pthreads
我更熟悉的 . 严格用于 *NIX 系统。
我有以下示例应用程序,它是从另一个 SO 问题借来的:
我通过以下方式在我的 Ubuntu 14.04 LTS 系统上安装了 Boost:
我通过以下方式编译上述代码:
我遇到了一些有趣的不一致之处。如果我设置了一个long ,比如1秒NAP_DURATION
(几毫秒。1000000
1
2
1
NAP_DURATION
当我使用 编写类似的此类应用程序pthreads
时,锁通常会在线程之间或多或少随机交替,因为另一个线程已经在互斥锁上被阻塞。
因此,对于问题:
- 这是预期的行为吗?
- 有没有办法控制这种行为,例如使作用域锁表现得像锁定操作排队?
- 如果 (2) 的答案是“否”,是否可以使用
Boost
条件变量实现类似的效果,而不必担心锁定/解锁调用失败? scoped_lock
s保证解锁吗?我正在使用 RAII 方法而不是手动锁定/解锁,因为显然解锁操作可能会失败并引发异常,我正在尝试使此代码可靠。
谢谢你。
澄清
我知道将调用线程置于睡眠状态不会解锁互斥锁,因为它仍在范围内,但预期的调度是:
- Thread1 锁定,获取互斥锁。
- Thread2 锁定、阻塞。
- Thread1 执行,释放锁定,并立即尝试再次锁定。
- Thread2 已经在等待锁,在 thread1 之前得到它。
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 编译的原因,以及为了让编译器将其检测为警告可以做些什么?
c++ - boost::named_mutex: 最后一个进程关闭时安全清理
我有一个资源需要保护在一个进程内以及跨多个进程的访问。我通过创建一个命名互斥体来管理这个boost::interprocess:named_recursive_mutex
,它工作得很好。
但是,据我了解,这应该最终通过 清理remove()
,即:
remove()
但是,这个调用似乎完全破坏了互斥锁,而不是检查/减少引用计数,所以当我知道没有其他进程正在使用它时,我试图找到一种安全的方法来发出调用。我也可以通过 boost 创建一块共享内存,但这似乎也没有共享引用计数。
我在 SO 上发现了一个类似的问题,但接受的答案似乎不足以满足我的需求,因为它只是指“增强文档”,但没有明确指示何时remove()
可以安全发布。
当我确定最后一个访问它的进程已经关闭或可能崩溃时,如何安全地清理这个命名的互斥锁?
谢谢你。
c++ - 错误:Boost_Mutex.exe 中 0x76f6f9d2 处的异常(第一次机会):0xC0000008:指定了无效句柄
我写了一个程序来测试多线程。在main
函数thread t
中创建了 a。in function D
,即 in ,将创建thread t
两个线程。该函数在. 在一个成员函数中会被调用。在一个成员函数中会被调用。tt
ttt
Process
thread ttt
Process
doAnotherThing
class Dat
thread tt
doOneThing
当我调试这个程序时,出现了一个错误:An exception (first chance) at 0x76f6f9d2 in Boost_Mutex.exe: 0xC0000008: An invalid handle was specified.
有时会发生此错误而不是上面的错误:
谁能帮我解决这个问题并修改代码?
这些是我的代码:
“达.h”
“数据.cpp”
“主.cpp”
如果您对我的问题陈述有任何建议,请告诉我,我会修改它。谢谢
c++ - 在 c/c++ 中完全(纯)用户空间锁定的 boost 或 stl 类?
boost或std STL中是否存在任何类,它利用原子指令并实现仅在用户空间中运行的同步锁?我确信线程将通过这种实现连续旋转以获取锁,但这对我的用例来说很好。这样的示例实现之一是here。但这是非常简单的锁,只允许一个读者或一个写者。我期望应该允许使用单个写入器或多个读取器实现锁定。
c++ - 提升进程间互斥锁崩溃而不是等待锁定?
我已经在这工作了好几天(甚至发布在 boost 论坛上),并且能够让第二个进程识别锁定的互斥锁似乎不起作用。请帮忙。这是代码:
一个常见的头文件:SharedObject.hpp
这是第一个程序:
这是第二个程序:
程序 1 工作正常。
程序 2 给出以下输出:
我首先运行 program1,它锁定互斥体并保持锁定 60 秒。在那段时间里,我运行程序 2 来查看它是否在等待锁,但它崩溃了。如何让程序 2 在互斥体上等待,直到程序 1 完成对共享内存的写入?
multithreading - 为什么即使您拥有互斥锁,互斥锁 try_lock 也会返回 false?
考虑这个简单的代码:
代码打印的Can't use lock
. 这是一个问题,因为在我的程序中,只有当线程对 lock 具有独占权时,我才需要执行异步操作。所以:
- 为什么当我拥有该互斥锁时 try_lock 返回 false?
- 如何创建仅由拥有锁的线程执行的代码块?
c++ - 如果线程对象声明为成员,则提升线程启动失败
我编写了一个名为 Task 的类,它封装了一个 boost::thread 并允许覆盖 run() 方法以在新创建的线程上做一些工作。
这是基类:
该类能够通过服务器类将事件发布到多个 http 会话,但这里不相关。一切正常,线程启动并成功发布事件,直到工作结束。这是一个工作片段:
这是恢复类:
现在我尝试将还原任务的工作拆分为 N 个子任务(Worker,也是任务的子类)。这里是恢复的新运行方法:
此代码失败,因为子线程的启动在尝试运行 Worker 类 run 方法时创建了一个 sigfault,因为它被报告为纯虚拟,而且尝试在 Task 基类上锁定互斥锁在此断言上失败:
直接创建一个 Worker 对象并启动它(对于恢复)不会产生任何问题!
乍一看,Restore run() 方法似乎在子线程之前结束,删除了 Worker 实例,然后在运行时调用基类(纯虚拟)并尝试访问已破坏的互斥体。(如果我在这里错了,请纠正我!)
使用调试器深入研究我发现的问题并非如此。问题似乎停留在 Worker 对象声明中,因为以下更改使代码可以正常工作:
我更喜欢在没有 new 运算符的情况下创建 Workers,因为在 Restore::run() 完成后我真的不需要让这些对象保持活动状态,并且我应该能够保证这些对象仍然存在,直到孩子们完成,因为线程加入(已通过调试器验证)。
谁能找到这里的瓶颈?
我已经能够找到一种方法来运行我的代码,但仍然缺少解决方案(但对我来说更重要的是这里的解释)。
最好的祝福