gpt4 book ai didi

使用 Bind 创建线程的 C++ 问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:21:40 25 4
gpt4 key购买 nike

我有一个关于线程和绑定(bind)交互的小问题。

很简单,我有这种情况

class myclass {
// ...
// ...
void dosome();
void doanother(myclass2, myclass3*);
void run() {
this->_myt = boost::shared_ptr<boost::thread>(
new boost::thread(boost::bind(&myclass::dosome, this)));
}
// ...
boost::shared_ptr<boost::thread> _myt;
//...
};

好的,到目前为止一切正常。我知道 bind 能够将函数或指向函数的指针绑定(bind)到某些值,或者更好的是,某些参数值。当我调用 myclass 对象时,函数 run() 启动了一个新线程。我有一个问题,为什么 bind 在运行时接受参数 this,而函数 dosome 不使用任何参数?是不是因为对于类函数,总是有一个隐式参数是指向类的指针???

好的,这不是我唯一的问题。在 dosome 中,这是我的第一个线程的执行流程,我这样做:

void myclass::dosome() {
myclass2 m;
myclass3* x = new myclass3;
boost::shared_ptr<boost::thread>(new boost::thread(
boost::bind(&myclass::doanother, m, x, this))); // Line X
}

好吧,我想执行另一个线程。第一个问题:shared_prt 是一个智能指针,这意味着如果 dosome() 从其 exec 流中退出,它从该范围执行的线程将持续存在,成为 shared_ptr ...请告诉我这是正确的。第二个问题:编译器对第 X 行的指令非常生气......问题是绑定(bind),它可能不喜欢我传递给那里的东西……为什么?这是一个成员函数(我说的是 doanother)并且有两个参数加上这个......问题出在哪里?

谢谢

最佳答案

  1. 您可以将其视为隐式参数。或者你可以这样想,比如 bind 需要调用你的成员函数,比如 something->your_member(),所以你必须告诉它什么 something是。

  2. 在第二个示例中,您没有将 shared_ptr 存储在任何地方,因此它会在创建后立即销毁。它指向的线程对象也将被销毁。然而线程的执行本身并没有绑定(bind)到线程对象,所以这将以完全相同的方式工作:

    void myclass::dosome() {
    myclass2 m;
    myclass3* x = new myclass3;
    boost::thread(boost::bind(&myclass::doanother, this, m, x)); // Line X
    }

    这会启动一个新线程并释放它,就像在您的代码中一样。线程继续运行。

  3. 正如您在上面看到的,this 应该作为第二个参数传递给绑定(bind)。

关于使用 Bind 创建线程的 C++ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4322744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com