我将第三方库(dcerpc)用于作为rpc服务器的应用程序。假设第三方函数位于名称空间third中。
我在线程中调用third::listen,以便侦听传入的请求。
"Third"提供了中断此侦听并正确退出线程的所有机制,但要么它不起作用,要么我没有以正确的方式执行。我首先尝试了所有库工具(演示示例、邮件列表、浏览源代码以了解…),但没有成功。
所以我尝试了另一种选择:猛烈地扼杀监听线程。但第三:我想,听没有取消点。
所以这个代码(我模拟上面的第三个::用监听函数监听):
void* listen(void*)
{
cout << "listening for calls...." << endl;
while (true) {}
printf ("Server stoppped listeningn");
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过程中隔离监听,但在我的项目上下文中,fork真的很痛苦(这是另一回事)。
非常感谢你的帮助。
尼古拉斯。
线程是否可以取消取决于其取消状态和类型。默认状态为enabled
。所以没关系。但默认类型是deferred
。这意味着,当您向线程发送取消请求时,它会被延迟,直到到达取消点。由于线程在空循环中不做任何事情,因此它根本不会达到取消点。因此,它不响应pthread_cancel()
。
您可以将线程的取消类型设置为PTHREAD_CANCEL_ASYNCHRONOUS
,这通常会使线程退出。呼叫
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
循环之前。
或者,您可以调用其中一个函数作为取消点。例如,在循环中执行fflush(stdout);
。
POSIX列出了许多函数作为取消点。请参阅此类列表的取消点。
我不能对"第三方"库发表任何评论,因为它不响应您提供的有限信息退出的线程。