c – 使用native_handle()取消std :: thread pthread_cancel()

我正在将一个先前的线程包装器转换为pthreads到std :: thread.
但是c 11没有任何方法可以取消该线程.尽管如此,我要求取消线程,因为它们可能在外部库中执行非常冗长的任务.

我正在考虑使用native_handle,它在我的平台上给了我pthread_id.我在Linux中使用gcc 4.7(Ubuntu 12.10).这个想法是:

#include <iostream>
#include <thread>
#include <chrono>

using namespace std;

int main(int argc,char **argv) {
    cout << "Hello,world!" << endl;

    auto lambda = []() {
        cout << "ID: "<<pthread_self() <<endl;
        while (true) {
            cout << "Hello" << endl;
            this_thread::sleep_for(chrono::seconds(2));
        }
    };

    pthread_t id;
    {
        std::thread th(lambda);

        this_thread::sleep_for(chrono::seconds(1));

        id = th.native_handle();
        cout << id << endl;
        th.detach();
    }
    cout << "cancelling ID: "<< id << endl;

    pthread_cancel(id);

    cout << "cancelled: "<< id << endl;

    return 0;
}

该线程被pthreads抛出的异常取消.

我的问题是:

这种方法会有问题吗(除了不便携)?

解决方法

不,我认为你不会有额外的问题:

>不便携
>必须仔细编程_very_very_,取消线程的所有对象都被销毁…

例如,标准说当一个线程结束时,变量将被销毁.如果你取消一个线程,这对编译器来说将更加困难,如果不是不可能的话.

因此,如果您可以以某种方式避免它,我建议不要取消线程.编写标准轮询循环,使用条件变量,监听信号以中断读取等等 – 并定期结束线程.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...