在 Linux 中何时使用 pthread_exit() 以及何时使用 pthread_join()?

2024-04-15

我是 pthreads 的新手,我正在尝试理解它。我看到了一些例子,如下所示。

我可以看到main()被 API 阻止pthread_exit(),而且我见过 main 函数被 API 阻塞的例子pthread_join()。我无法理解何时使用什么?

我指的是以下网站 -https://computing.llnl.gov/tutorials/pthreads/ 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() http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_exit.html将退出调用它的线程。

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

pthread_join http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html将挂起调用它的线程的执行,除非目标线程终止

当您想在进一步操作之前等待线程终止时,这非常有用 在主线程中处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Linux 中何时使用 pthread_exit() 以及何时使用 pthread_join()? 的相关文章

随机推荐

  • 将 JComboBox 放入 JTable 中

    我想将单独的 JComboBox 放入 JTable 的每个单元格中 IE 每个单元格的 JComboBox 内容都不相同 我基本上希望能够调用以下代码来将一行 JComboBox 添加到 JTable 中 有人有什么想法吗 谢谢 JCom
  • 如何在移动滑块时锁定页面滚动

    在 Flutter 中 我有一个应用程序 在自定义 ListView 小部件内有一个自定义滑块 唯一的问题是 当您移动滑块手柄 从左到右 时 由于 ListView 页面仍然会滚动 向上和向下 而我需要页面锁定到位 直到用户停止移动滑块 我
  • 读取 NTFS 格式的 MFT

    在网上寻找如何读 写 MFT 的解释时 我发现了以下部分 http www installsetupconfig com win32programming 1996 20AppE apnilife pdf http www installs
  • 将 nl2br 与 html 标签一起使用

    I use nl2br当显示保存在某处的一些信息时 但是当使用 HTML 标签时我不想添加 br 他们的标签 例如 如果我使用 table th th table 它将被转换为 table br th th br table br 这为这张
  • n 层架构 - BLL、DAL 和接口。什么是最佳实践?

    我有一个关于 n 层架构的问题 在问这个问题之前 我想了很久 因为这里已经有很多类似的问题了 但是 在看了一天半并阅读了其他答案之后 我仍然不确定 各种看似相似的术语和不同的方法让我感到困惑 如果我在不同的类库中有一个 BLL 和一个 DA
  • 购物车 API V3:无法为具有选项的产品创建购物车

    当我创建一个包含没有选项的产品的购物车时 一切正常 但如果任何产品有产品选项 则它不起作用 这里我得到了产品选项 它有一个 id 21 的选项 当我在创建 API 时使用此选项 id 时 它不起作用 如果您要将产品添加到购物车 并且该产品具
  • 将 celery 任务结果链接到通讯组中

    Like in 这另一个问题 https stackoverflow com questions 13271056 how to chain a celery task that returns a list into a group 我想
  • 绘制别名、像素完美的 1px 样条线(特别是 Catmull-Rom)

    简要背景 我正在开发一个基于 Web 的绘图应用程序 需要绘制穿过其控制点的 1px 粗样条线 我正在努力解决的问题是我需要绘制 p1 和 p2 之间的每个像素 就像我使用 1px 铅笔工具一样 因此 没有抗锯齿功能 一次一个像素 这需要手
  • MySQL 如何使用 INTO OUTFILE 追加到文件?

    我有以下代码 SELECT INTO OUTFILE TestInput Results csv FIELDS TERMINATED BY LINES TERMINATED BY n FROM Results 期望的结果是不断附加到 Res
  • 将二叉树转换为排序数组

    有没有一种方法可以将二进制转换为排序数组 而不必遍历树来查找每个数组索引 Node root Node runner int current smallest void findsmallest Node root Pre order tr
  • 使用 Python 从 AWS Lambda 连接到 DocumentDB

    我正在尝试从 Lambda 函数连接到 DocumentDB 我已经按照此配置了我的 DocumentDBtutorial https aws amazon com getting started hands on getting star
  • 如何让Mermaid中指定的节点水平对齐?

    这是我的流程图 graph TB aaa gt bbb gt ddd ccc ddd gt fff ccc gt eee fff fff gt hhh ggg kkk hhh gt iii mmm ggg kkk gt mmm 但实际上我想
  • NHibernate - 左连接

    我有以下两个表 JobsAreaID JobNo 复合键 Logs日志ID 区域ID 作业编号 我需要获取所有没有与之关联的日志的作业 在 SQL 中我可以这样做 SELECT Jobs AreaID Jobs JobNo FROM Job
  • 使用 numpy 执行外加法

    抱歉 如果这是一个愚蠢的问题 但我刚刚开始使用 python numpy 我真的不确定最有效的方法 我正在为一些学生制作一个演示 N 体模拟器 但现在 我通过循环这些粒子的位置来计算粒子之间的力 可以预见 速度会像糖蜜一样慢 基本上 给定一
  • 在java中注入击键

    我正在寻找一种将击键注入操作系统键盘输入缓冲区的方法 就像当您单击一个按钮时 程序会插入一个 或多个 键盘敲击 我想在java中执行此操作 因为我想在 win linux和osx 中运行它 我想我必须利用 JNI 有人有什么想法吗 感谢所有
  • 向 Qt 对话框添加最小化按钮?

    我创建了一个QDialog基于使用 Qt Creator 的应用程序 除了对话框没有最小化按钮之外 一切都很好 我怎样才能添加一个 设计器中有我可以设置的属性吗 您无法自己添加最小化按钮 因为它是由窗口管理器处理的 您可以使用窗口管理器提示
  • Devise_token_auth 冲突?

    使用默认的 api 标签在 Rails 5 中创建了一个新的 API 并使用命令安装了 devise token auth gemrails generate devise token auth install User auth 关于做r
  • JavaScript 未知数量的参数

    在我的项目中 我注册了不同的函数 具有不同数量的参数 作为许多事件的侦听器 当事件发生时 我需要触发相关的函数 我接收以数组形式传递给侦听器方法的参数 而侦听器函数需要每个单独的参数 所以 我正在这样做 但我不喜欢这种方法 想知道是否有一种
  • 修改 Silverlight 3 中新 Popup 控件 (ChildWindow) 的外观/行为

    我想删除 Silverlight 3 中新 Popup 控件的灰色标题 如果这可能的话有什么想法吗 很简单 只需编辑默认的 ChildWindow 样式即可 在 Blend 3 中创建一个 ChildWindow 类型的新项目 右键单击项目
  • 在 Linux 中何时使用 pthread_exit() 以及何时使用 pthread_join()?

    我是 pthreads 的新手 我正在尝试理解它 我看到了一些例子 如下所示 我可以看到main 被 API 阻止pthread exit 而且我见过 main 函数被 API 阻塞的例子pthread join 我无法理解何时使用什么 我