c - 在 Linux 中何时使用 pthread_exit() 以及何时使用 pthread_jo

我是 pthreads 的新手,我正在努力理解它。我看到了一些类似下面的例子。

我可以看到 main()被 API pthread_exit() 阻止,并且我看到了主要功能被 API pthread_join() 阻止的示例.我无法理解何时使用什么?

我指的是以下网站 - https://computing.llnl.gov/tutorials/pthreads/ .我无法理解何时使用 pthread_join()以及何时使用 pthread_exit() .

有人可以解释一下吗?此外,我们将不胜感激 pthreads 的良好教程链接。

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }

   /* Last thing that main() should do */
   pthread_exit(NULL);

意识到另一件事,即

pthread_cancel(thread);
pthread_join(thread, NULL);

有时,您想在线程执行时取消它。 您可以使用 pthread_cancel(thread); 来执行此操作。 但是,请记住您需要启用 pthread 取消支持。 此外,取消时的清理代码。

thread_cleanup_push(my_thread_cleanup_handler, resources);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 0);

static void my_thread_cleanup_handler(void *arg)
{
  // free
  // close, fclose
}

最佳答案

如 openpub 文档中所述,

pthread_exit()将退出调用它的线程。

在您的情况下,由于 main 调用它, main thread 将终止,而您的衍生线程将继续执行。这主要用于以下情况 主线程只需要生成线程并让线程完成它们的工作

pthread_join 除非目标线程终止,否则将暂停调用它的线程的执行

这在您想等待线程终止后再进一步的情况下很有用 在主线程中处理。

关于c - 在 Linux 中何时使用 pthread_exit() 以及何时使用 pthread_join()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20824229/

相关文章:

linux - 在tmux中绑定(bind)Ctrl+Tab和Ctrl+Shift+Tab

python - 在 Ubuntu 中启动时运行 Python 脚本

linux - 为什么 Linux 不通过 TSS 使用硬件上下文切换?

linux - Vagrant 的鸡和蛋 : Shared folder with uid = ap

linux - 在 PHP CLI 中设置 max_execution_time

linux - 我需要 -D_REENTRANT 和 -pthreads 吗?

linux - 使用 linux 命令行 (bash) 从网络摄像头拍照

c - 为什么 pthread 互斥锁被认为是 "slower"而不是 futex?

c++ - 如何在 Linux 中命名线程?

ruby-on-rails - Ruby on Rails - 无法将 "\x89"从 ASCII-