如何在没有取消点的情况下取消pthread



我将第三方库(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列出了许多函数作为取消点。请参阅此类列表的取消点。

我不能对"第三方"库发表任何评论,因为它不响应您提供的有限信息退出的线程。

相关内容

最新更新