c – 使用native_handle()取消std :: thread pthread_cancel()
发布时间:2020-12-16 07:02:23 所属栏目:百科 来源:网络整理
导读:我正在将一个先前的线程包装器转换为pthreads到std :: thread. 但是c 11没有任何方法可以取消该线程.尽管如此,我要求取消线程,因为它们可能在外部库中执行非常冗长的任务. 我正在考虑使用native_handle,它在我的平台上给了我pthread_id.我在Linux中使用gcc 4
我正在将一个先前的线程包装器转换为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抛出的异常取消. 我的问题是: 这种方法会有问题吗(除了不便携)? 解决方法
不,我认为你不会有额外的问题:
>不便携 例如,标准说当一个线程结束时,变量将被销毁.如果你取消一个线程,这对编译器来说将更加困难,如果不是不可能的话. 因此,如果您可以以某种方式避免它,我建议不要取消线程.编写标准轮询循环,使用条件变量,监听信号以中断读取等等 – 并定期结束线程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |