如何解决Boost线程:构造后启动线程**不在构造函数中
在我的代码中,我想(至少在调试版本中)确保某些功能仅在特定线程中执行。更具体地说,考虑以下类别:
class MyClass {
private:
boost::thread m_thread;
void doStart();
public:
void start();
};
start
的实现是
void MyClass::start() {
m_thread = boost::thread(&MyClass::doStart,this);
}
aka:它创建一个新线程并在该新线程中执行doStart
函数。此外,它将新线程存储在成员变量中。
在doStart
的开头,检查它在其中执行的线程:
void MyClass::doStart() {
assert(m_thread.get_id() == boost::this_thread::get_id());
}
这应该确保仅在存储在doStart
中的类自己的工作程序线程中运行m_thread
。
在大多数情况下,此方法工作正常,但此断言有时会失败。考虑了一段时间后,我有一些我认为可行的理论:
- 在线程执行开始时立即调用
get_id()
可能会出现问题(boost中可能存在某种竞争条件) - 在执行
doStart
和m_thread
的分配之间存在竞争条件,因此有时doStart
会在未初始化的m_thread
变量被分配值之前访问它 -
m_thread
的分配格式不正确,因为它可能无意中调用了线程对象的副本构造函数(可能会更改ID)
从这些可能性中,我认为2)最有可能。如果是这种情况,我的问题将是:从发现的内容来看,我无法将线程分配给m_thread
,然后启动它。因此,我无法确保m_thread
在新线程中运行之前已初始化doStart
。
我唯一能想到的解决方案是引入一个附加成员变量std::atomic<bool>
,该成员变量初始化为false
,并且仅在{em>之后设置为true
。 m_thread
已分配。然后,在doStart
中,我将在确认线程ID之前在该条件下执行主动等待。不过,这对我来说似乎并不很吸引人。有更好的方法吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。