【问题标题】:How to terminate a std::thread?如何终止 std::thread?
【发布时间】:2016-07-23 05:19:01
【问题描述】:

我目前正在开发一个程序,需要从socket服务器下载一些图片,下载工作会执行很长时间。所以,我创建了一个新的std::thread 来做到这一点。

下载后std::thread会调用当前Class的一个成员函数,但是这个Class很可能已经被释放了。所以,我遇到了一个例外。

如何解决这个问题?

void xxx::fun1()
{
   ...
}
void xxx::downloadImg()
{
 ...a long time
  if(downloadComplete)
  {
   this->fun1();
  }
}
void xxx::mainProcees()
{
  std::thread* th = new thread(mem_fn(&xxx::downloadImg),this);
  th->detach();
  //if I use th->join(),the UI will be obstructed
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!我尽可能地编辑了你的问题。但是,添加代码和描述的解释,以便更多具有该主题知识的人看到它。请在您遇到的特定错误消息中进行编辑,以防有必要识别特定问题。祝你好运!
  • 你为什么不使用std::future<Image>
  • C++0x thread interruption的可能重复
  • 一般来说,自己使用线程总是一个坏主意。

标签: c++ multithreading c++11 cocos2d-x stdthread


【解决方案1】:

不要分离线程。相反,您可以拥有一个数据成员,其中包含指向thread 的指针,以及join 析构函数中的线程。

class YourClass {
public:
    ~YourClass() {
        if (_thread != nullptr) {
            _thread->join();
            delete _thread;
        }
    }
    void mainProcees() {
        _thread = new thread(&YourClass::downloadImg,this);
    }
private:
    thread *_thread = nullptr;
};

更新

正如@milleniumbug 指出的那样,您不需要为thread 对象动态分配,因为它是可移动的。所以另一种解决方案如下。

class YourClass {
public:
    ~YourClass() {
        if (_thread.joinable())
            _thread.join();
    }
    void mainProcess() {
        _thread = std::thread(&YourClass::downloadImg, this);
    }
private:
    std::thread _thread;
};

【讨论】:

  • 谢谢,这个方法我试过了,但是是特殊场合,“YourClass”是游戏场景,用户可以随时弹出这个场景,如果这样做会阻塞很久当用户弹出这个场景时
  • 在这种情况下,您必须在主线程和下载线程之间进行一些同步。例如,您可以有一个“停止”标志。下载线程每1秒检查一次标志,如果标志已设置,则退出下载。在析构函数中,先设置'stop'标志,然后加入线程。
  • 感谢您的帮助,现在可以使用了。如果“downloadImg”功能是静态库的接口,我该怎么办?
  • 如果库设计得当,应该有一个停止下载的界面。因此,您可以在析构函数中调用terminate_download 接口,而不是设置“停止”标志。如果它没有这样的界面,你就无能为力了。强行终止线程总是一个坏主意。
  • 事实上,我很想知道如何在这个问题中强行终止一个std线程..,似乎标准库没有提供这样的功能,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多