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

时间:2015-12-02 18:58:38

标签: c++ linux pthreads pthread-join

我使用第三方库(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进程中隔离监听,但在我的项目环境中,分叉是非常痛苦的(这是另一个故事)。

非常感谢您的帮助。

尼古拉斯。

1 个答案:

答案 0 :(得分:1)

是否可以取消线程取决于其取消状态类型。默认状态为enabled。所以没关系。但默认类型为deferred。这意味着当您向线程发送取消请求时,它会被推迟到达取消点。由于您的线程在空循环中没有执行任何操作,因此它根本不会到达取消点。因此,它不响应pthread_cancel()

您可以将线程的取消类型设置为PTHREAD_CANCEL_ASYNCHRONOUS,这通常会使线程退出。致电

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
在循环之前

或者您可以调用其中一个取消点的功能。例如,在循环中执行fflush(stdout);

POSIX列出许多功能作为取消点。有关此类列表,请参阅cancellation points

我无法对“第三方”库做出任何评论,因为您提供的信息有限,它不响应退出的线程。