我为我的应用程序使用 3rd-party-library (dcerpc) 作为 rpc 服务器。假设第 3 方函数位于命名空间 third。
我在一个线程中调用了third::listen,以便监听传入的请求。
“第三”提供了中断此侦听并正确退出线程的所有机制,但要么不起作用,要么我没有以正确的方式进行操作。我首先尝试使用库工具(演示示例、邮件列表、浏览源代码以了解...),但没有成功。
所以我尝试了另一种选择:暴力杀死监听线程。但是我猜第三个::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 进程中隔离监听,但在我的项目环境中,fork 真的很痛苦(这是另一个故事)。
非常感谢您的帮助。
尼古拉斯。