C++ 杀死等待 std::thread

Posted

技术标签:

【中文标题】C++ 杀死等待 std::thread【英文标题】:C++ Kill waiting std::thread 【发布时间】:2016-10-01 12:49:59 【问题描述】:

我的辅助线程侦听通道兔子,并希望在我调用方法 stopListen() 时将其从主线程中删除。

void PFClient::startListen()

this->stop = false;
this-> t = thread(&PFClient::callback,this);    


void PFClient::callback()

PFAPIResponse* response;
char * temp;
    while (!this->stop)
    
        try
        

            std::string receiver_data = "";
            //std::wcout << L"[Callback] oczekiwanie na wiadomość !" << endl;
            receiver_data = this->channel->BasicConsumeMessage()->Message()->Body();
            temp = &receiver_data[0];
... some operation with received data

void PFClient::stopListen()

this->stop = true;

信号量不能正常工作,因为它只有在收到下一条消息后才会工作。 我尝试 detach(),terminate() 但不工作。 我怎样才能残酷地杀死这个过程?

【问题讨论】:

你真的应该避免杀死它(资源泄漏等) 你可以使用no-blocking接收功能吗?每个像样的库都应该有一个 block_for 函数 @deviantfan 我知道,但如果我想怎么做? 【参考方案1】:

正如我在评论中已经建议的那样,您可以使用无阻塞功能。

如果您使用的库不提供它,那么async 可能是一个有效的替代方案:

while (this->stop == false) 
  auto receiver_data = std::async(/* ... address function and object*/);

  // wait for the message or until the main thread force the stop
  while (this->stop == false &&
         (receiver_data.wait_for(std::chrono::milliseconds(1000) == std::future_status::timeout))
    ;

  if (this->stop == false && receiver_data.vaild() == true) 
    // handle the message
  

【讨论】:

谢谢,我会试试这个!!这是github.com/alanxz/SimpleAmqpClient,它是同步方法

以上是关于C++ 杀死等待 std::thread的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X 上调试和杀死应用程序?

如何不等待 OpenMP 中的其他线程?

如何使用 C++ 以编程方式杀死进程?

匿名管道:当子进程被杀死时,父进程中的 ReadFile 继续等待

为啥 ssh 在没有 -t 的情况下等待我的子 shell,然后用 -t 杀死它们?

等待设备时出错:AVD的仿真器进程被杀死了