c++ - 我自己 pthread_join 是否可以接受并且安全?

标签 c++ thread-safety pthreads

我有一个类似这样的设置:

void* work(void*) { while (true) {/*do work*/} return 0;}

class WorkDoer
{
private:
    pthread_t id;
public:
    WorkDoer() { pthread_create(&id, NULL, work, (void*)this); }
    void Shutdown() { pthread_join(id, NULL); /*other cleanup*/ }
}

在某些情况下,Shutdown() 是从主线程调用的,而在其他一些情况下,我想从线程本身内部调用关闭(之后立即从该线程返回)。

pthread_join() 的文档说,如果调用线程与传递的线程相同,它将返回一个 EDEADLK

我的问题是:这样做可以吗?如果可以,是否安全? (因此忽略连接失败,因为我很快就会很好地结束线程?)或者,这是应该避免的事情吗?

最佳答案

您当然可以从正在运行的线程本身调用 pthread_join(),正如您所发现的那样,调用本身会正确处理它并给出一个错误代码。但是,存在一些问题:

  1. 这没有任何意义,因为连接不会连接任何东西。它只会告诉您您做错了什么。
  2. 线程本身不会在调用 pthread_join() 时退出。
  3. 即使线程存在,它的状态也不会被正确清理。其他一些线程(即您的应用程序的主线程)应该调用 pthread_join(),除非该线程被创建为“分离的”。

换句话说,这种方法与程序中的错误一样可以接受。

作为解决方案,我建议重新审视设计并确保从正确的位置和正确的时间调用 Shutdown()。毕竟,“shutdown”这个名字在这里没有多大意义,因为它不会关闭任何东西。它所做的只是等待线程完成并在完成后清理其状态。

当你想结束工作线程时,要么从线程例程返回,要么调用pthread_exit()。 .然后确保启动线程的人通过调用 pthread_join() 来清理事情。

如果你想强制线程停止,考虑使用pthread_kill()向线程发出信号,或者实现某种消息传递,您可以使用它来“告诉”线程停止做它正在做的任何事情。

关于c++ - 我自己 pthread_join 是否可以接受并且安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16464833/

相关文章:

c++ - 为什么 g++ 在完全相同的文件上失败,但在不同的计算机上

c# - 如何以线程安全的方式调用 .NET ConcurrentDictionary 上的 GetOrAdd 方法?

c - pthread_mutex_trylock的返回和pthread_mutex_lock的返回有什么区别

使用 pthreads 在多线程代码中计数器值意外更改

c++ - 为连接点客户端提供 IDispatch 实现

c++ - 相同的 Direct2D 应用程序在 "slower"机器上表现更好

c++ - 在 Word 中迭代段落

c# - 解决 C# 中的线程冲突

c# - 拥有静态 IReadOnlyDictionary 字段是否线程安全?

php - 从命令为 pthread 引导 symfony2