0

我为我的应用程序使用 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 真的很痛苦(这是另一个故事)。

非常感谢您的帮助。

尼古拉斯。

4

1 回答 1

1

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

您可以设置PTHREAD_CANCEL_ASYNCHRONOUS通常会使线程退出的线程的取消类型。称呼

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);

在循环之前。

或者您可以调用作为取消点的函数之一。例如,fflush(stdout);在循环内执行。

POSIX 列出了许多函数作为取消点。有关此类列表,请参阅取消点

我无法对“第 3 方”库发表任何评论,该库不使用您提供的有限信息响应退出线程。

于 2015-12-02T20:18:53.690 回答