c - 您如何查询 pthread 以查看它是否仍在运行?

标签 c multithreading concurrency pthreads destructor

在我的析构函数中,我想彻底销毁一个线程。

我的目标是等待一个线程完成执行,然后销毁该线程。

关于查询 pthread 的状态,我唯一发现的是 pthread_attr_setdetachstate但这只会告诉您线程是否:

  • PTHREAD_CREATE_DETACHED
  • PTHREAD_CREATE_JOINABLE

这两个都与线程是否还在运行无关。

如何查询 pthread 以查看它是否仍在运行?

最佳答案

听起来你在这里有两个问题:

我如何才能等到我的线程完成?

回答:这是直接由 pthreads 支持的——让你的待停止线程 JOINABLE(当它第一次启动时),并使用 pthread_join() 阻塞你的当前线程,直到待停止线程不再运行。


如何判断我的线程是否仍在运行?

答案:您可以添加一个“thread_complete”标志来完成此操作:

场景:线程 A 想知道线程 B 是否还活着。

当线程 B 创建时,它被赋予一个指向“thread_complete”标志地址的指针。在创建线程之前,“thread_complete”标志应初始化为 NOT_COMPLETED。线程 B 的入口点函数应立即调用 pthread_cleanup_push() 以推送将“thread_complete”标志设置为已完成的“清理处理程序”。

在此处查看有关清理处理程序的详细信息:pthread cleanup handlers

您需要包含相应的 pthread_cleanup_pop(1) 调用以确保无论发生什么情况(即线程正常退出或由于取消等)都会调用清理处理程序。

然后,线程 A 可以简单地检查“thread_complete”标志以查看线程 B 是否已经退出。

注意:您的“thread_complete”标志应声明为“volatile”并且应该是原子类型——GNU 编译器为此提供了 sig_atomic_t。这允许两个线程一致地访问相同的数据,而不需要同步结构(互斥量/信号量)。

关于c - 您如何查询 pthread 以查看它是否仍在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156353/

相关文章:

c - 为什么 malloc() 在使用指向 `double` 的指针时没有分配正确大小的内存?

java - 将任务从 EDT 分派(dispatch)到 main?

javascript - 如何在 Node.js 中处理密集型任务

java - 静态方法中的类实例是线程安全的

c - 在 Matlab 中编译 mex 文件时找不到标准 C 库

c - 尝试将 gets 与结构一起使用,但它不起作用

c - 参数中的指针出现问题..c 中的冒泡排序

c++ - 隔离一个类的并发/非并发访问数据成员

c++ - 不持有锁的本地静态初始化避免了 C++11 中可能出现的死锁?

concurrency - goroutine 是如何工作的?