我在程序中创建了两个线程。我想基于flag终止thread_1函数内的thread_1,反之亦然。我尝试了exit()和pthread_exit(Thread_id),但它不起作用。我想通过调用pthread_cancel来取消线程执行,但问题是我无法在pthread_create之前传递线程id。有什么建议??
答案 0 :(得分:0)
您可以看到pthread_cancel
的工作原理in the manpage。
但是,既然你提到C ++,为什么不使用语言功能呢?使用条件变量可以完成一个或多个其他线程的信号传输。
如果你没有C ++ 11,你可以使用Boost Threads。
#include <thread>
#include <condition_variable>
#include <iostream>
using namespace std;
struct workers
{
mutex mx;
condition_variable cv;
bool canceled;
workers() : canceled(false) {}
void thread1()
{
cout << __PRETTY_FUNCTION__ << " start\n";
this_thread::sleep_for(chrono::seconds(2));
{
unique_lock<mutex> lk(mx);
cout << __PRETTY_FUNCTION__ << " signaling cancel\n";
canceled = true;
cv.notify_all();
}
this_thread::sleep_for(chrono::seconds(2));
cout << __PRETTY_FUNCTION__ << " done\n";
}
void thread2()
{
cout << __PRETTY_FUNCTION__ << " start\n";
for(;;)
{
// do some work
unique_lock<mutex> lk(mx);
if (cv.wait_for(lk, chrono::milliseconds(10), [this] { return canceled; }))
break;
}
cout << __PRETTY_FUNCTION__ << " done\n";
}
};
int main()
{
workers demo;
std::thread t1(&workers::thread1, ref(demo));
std::thread t2(&workers::thread2, ref(demo));
t1.join();
t2.join();
}
输出:
void workers::thread1() start
void workers::thread2() start
void workers::thread1() signaling cancel
void workers::thread2() done
void workers::thread1() done
更新现在,带有提升功能的C ++ 03版本也是 Live On Coliru 。我添加了时间戳以获得乐趣:
thread1:21 2014-Mar-26 00:01:40.074269 start
thread2:37 2014-Mar-26 00:01:40.074275 start
thread1:26 2014-Mar-26 00:01:42.074873 signaling cancel
thread2:47 2014-Mar-26 00:01:42.074991 done
thread1:32 2014-Mar-26 00:01:44.075062 done