微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Boost线程:构造后启动线程**不在构造函数中

如何解决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

在大多数情况下,此方法工作正常,但此断言有时会失败。考虑了一段时间后,我有一些我认为可行的理论:

  1. 在线程执行开始时立即调用get_id()可能会出现问题(boost中可能存在某种竞争条件)
  2. 在执行doStartm_thread的分配之间存在竞争条件,因此有时doStart会在未初始化的m_thread变量被分配值之前访问它
  3. m_thread的分配格式不正确,因为它可能无意中调用了线程对象的副本构造函数(可能会更改ID)

从这些可能性中,我认为2)最有可能。如果是这种情况,我的问题将是:从发现的内容来看,我无法将线程分配给m_thread,然后启动它。因此,我无法确保m_thread在新线程中运行之前已初始化doStart

我唯一能想到的解决方案是引入一个附加成员变量std::atomic<bool>,该成员变量初始化为false,并且仅在{em>之后设置为truem_thread已分配。然后,在doStart中,我将在确认线程ID之前在该条件下执行主动等待。不过,这对我来说似乎并不很吸引人。有更好的方法吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?