【问题标题】:How to use pthread_tryjoin_np() to know if a pthread was terminated via pthread_exit如何使用 pthread_tryjoin_np() 知道 pthread 是否通过 pthread_exit 终止
【发布时间】:2021-06-02 14:37:34
【问题描述】:

我当前的任务是处理多线程的生产者/消费者问题。我目前已经实现了生产者-消费者问题,但是,分配还有另一部分我们必须模拟我们的线程崩溃。显然这是通过调用pthread_exit(NULL); 来完成的。我得到了使用 pthread_tryjoin_np() 的提示,但我似乎无法让它工作。 我目前与pthread_tryjoin_np() 加入的实现是:

for(i = 0; i < numThread; i++) {
    if(pthread_tryjoin_np(th[i], NULL) != 0) {
        pthread_create(&th[i], NULL, &consumer, NULL);
    }
}

我不确定我是否错误地使用了pthread_tryjoin_np(),但使用pthread_tryjoin_np() 或其他解决方案的修复会很棒。

【问题讨论】:

  • 教师似乎不理解他们试图教授的 API。线程不会崩溃。如果一个线程执行了一些生成未处理的致命信号的操作,则 进程 将终止。 “检查我们的线程是否崩溃并重新启动它”作为操作毫无意义。除非您选择退出,否则您的线程无法退出。

标签: c pthreads


【解决方案1】:

正如我最初在评论中指出的那样:

教师似乎不理解他们试图教授的 API。线程不会崩溃。如果一个线程执行了一些生成未处理的致命信号的操作,则 进程 终止。 “检查我们的线程是否崩溃并重新启动它”作为操作毫无意义。如果您不选择退出,您的线程将无法退出。

但是,如果您无论如何都想这样做以使他们高兴,那么您的问题只是您的条件倒退了;你有!= 0 其中== 0 是你的意思。 pthread_tryjoin_np 成功(返回 0)当且仅当线程已退出。

【讨论】:

  • OP 还应该认识到函数名称中的_np 是“不可移植”的助记符。这个函数是一个 GNU 扩展,如果你只关心基于 Glibc 的系统,这很好,但如果你对更广泛的适用性感兴趣,那就不是很好。
  • 嗯,它现在工作得更好,但是,由于 pthread_tryjoin_np 的非阻塞方面,循环将在生成任何内容之前完全迭代。从本质上讲,在循环完成之前,任何东西都没有机会崩溃。
  • 嗯,是的,你必须重复它,最好不要以 100% cpu 负载旋转,而是等待至少一个线程终止的事件。 pthread_tryjoin_np 无法做到这一点;相反,您可以让线程通过受互斥锁保护并用条件变量发出信号的数据告诉您它们已经退出。所有这一切都在强调,您的讲师的想法毫无意义,并且是基于对 pthread API 的根本误解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多