我使用第三方库(dcerpc)作为rpc服务器的应用程序。 让我们说第三方函数在命名空间中排在第三位。
我调用第三个::侦听一个线程,以便侦听传入的请求。
"第三"提供了中断此监听并正确退出线程的所有机制,但要么它不起作用,要么我没有以正确的方式做到这一点。 我首先尝试使用库工具(演示样本,邮件列表,浏览源代码以了解...),但没有成功。
所以我尝试了另一种选择:猛烈地杀死听力线程。 但是我认为第三个:: listen没有取消点。
所以这段代码(我用上面的listen函数模拟第三个:: listen):
void* listen(void*)
{
cout << "listening for calls...." << endl;
while (true) {}
printf ("Server stoppped listening\n");
return 0;
}
int main()
{
pthread_t thread = 0;
int res = pthread_create(&thread, 0, listen, 0);
cout << "pthread_create res: " << res << endl;
sleep(1);
bool isThreadRunning = (pthread_tryjoin_np(thread, 0) != 0);
cout << "Thread is running: " << isThreadRunning << endl;
res = pthread_cancel(thread);
cout << "pthread_cancel res: " << res << endl;
sleep(1);
isThreadRunning = (pthread_tryjoin_np(thread, 0) != 0);
cout << "Thread is running: " << isThreadRunning << endl;
res = pthread_join(thread, 0);
cout << "pthread_join res: " << res << endl;
return 0;
}
将输出:
pthread_create res: 0
listening for calls....
Thread is running: 1
pthread_cancel res: 0
Thread is running: 1
和pthread_join(thread,0)阻塞(逻辑因为没有取消点)。
我的问题:如何杀死这个帖子!!
我尝试了信号,但它停止了我的整个过程,而不仅仅是线程。
我的最后一次尝试是在专用的fork进程中隔离监听,但在我的项目环境中,分叉是非常痛苦的(这是另一个故事)。
非常感谢您的帮助。
尼古拉斯。
答案 0 :(得分:1)
是否可以取消线程取决于其取消状态和类型。默认状态为enabled
。所以没关系。但默认类型为deferred
。这意味着当您向线程发送取消请求时,它会被推迟到达取消点。由于您的线程在空循环中没有执行任何操作,因此它根本不会到达取消点。因此,它不响应pthread_cancel()
。
您可以将线程的取消类型设置为PTHREAD_CANCEL_ASYNCHRONOUS
,这通常会使线程退出。致电
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
在循环之前。
或者您可以调用其中一个取消点的功能。例如,在循环中执行fflush(stdout);
。
POSIX列出许多功能作为取消点。有关此类列表,请参阅cancellation points。
我无法对“第三方”库做出任何评论,因为您提供的信息有限,它不响应退出的线程。