Linux——pthread_create()

2023-11-19

1 pthread_create

       pthread_create是(Unix、Linux、Mac OS X)等操作系统的创建线程的函数。它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。 

       函数原型声明:

#include <pthread.h>
int pthread_create(
  pthread_t *restrict tidp,           //指向新创建线程标识符的指针
  const pthread_attr_t *restrict attr,//设置线程属性,默认为NULL
  void *(*start_rtn)(void *),         //线程运行函数的起始地址
  void *restrict arg                  //运行函数的参数结构,默认为NULL
                  );
//成功,返回0;出错,返回错误码。

        传递参数注意的问题:

问题: 
避免直接在传递的参数中传递发生改变的量,否则会导致结果不可测。 
即使是只再创造一个单线程,也可能在线程未获取传递参数时,线程获取的变量值已经被主线程进行了修改。

通常解决方案: 
重新申请一块内存,存入需要传递的参数,再将这个地址作为arg传入。

2 使用注意事项

  • 配套使用pthread_join函数

       在默认情况下通过pthread_create函数创建的线程是非分离属性的,由pthread_create函数的第二个参数决定,在非分离的情况下,当一个线程结束的时候,它所占用的系统资源并没有完全真正的释放,也没有真正终止。此时只有在pthread_join函数返回时,该线程才会释放自己的资源。 

       pthread_join()函数会一直阻塞调用线程,直到指定的线程终止。当pthread_join()返回之后,应用程序可回收与已终止线程关联的任何数据存储空间。 
      但是,同时需要注意,一定要和上面创建的某一线程配套使用,这样还可以起到互斥的作用。否则多线程可能抢占CPU资源,导致运行结果不确定。

  • 设置线程是detached(分离属性的)

        还可以在线程创建时或者在 thread function 中调用中将其设置其为分离属性(第二个参数设定),这样一个线程结束会立即释放它所占用的资源。

 

pthread_join()函数原型

int pthread_join(

    pthread_t tid,    //需要等待的线程,指定的线程必须位于当前的进程中,而且不得是分离线程

    void **status     //线程tid所执行的函数返回值(返回值地址需要保证有效),其中status可以为NULL

);

pthreadlinux系统的默认库, 需手动链接-线程库 -lpthread

返回值: 
调用成功返回0. 
ESRCH 
描述: 没有找到与给定的线程ID 相对应的线程。(如果多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止。然后一个等待线程成功返回。其余的等待线程将失败返回ESRCH错误) 
EDEADLK 
描述: 将出现死锁,如一个线程等待其本身,或者线程A和线程B 互相等待。 
EINVAL 
描述: 与给定的线程ID相对应的线程是分离线程。

 

 

更多详细程序见:多线程之pthread_create()函数 

更多对pthread_create参数的解析见:多线程pthread_create的参数

对线程创建个数的探讨参考:linux——pthread_create()到底可以创建多少个线程?

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

Linux——pthread_create() 的相关文章

  • 段错误...关于你好世界

    这段代码非常简单 但我在 x86 64 Linux 系统上遇到了段错误 这让我很烦恼 刚开始接触asm 请耐心等待 与 NASM 组装nasm f elf64 test asm 与连接ld o test test o SECTION tex
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • 如何通过 makefile 在 Linux 上安装程序? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux Unix make install 应该包含什么 https stackoverflow com questions 528399 what should linux unix make
  • Apache 端口转发 80 到 8080 并访问 Apache (80) 中托管的应用程序,即 phpMyadmin 和 Tomcat (8080)

    我想访问托管在 tomcat 服务器 8080 中的应用程序 myapp 当前可以通过以下方式访问http example com 8080 myapp http example com 8080 myapp in http example
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 如何在线程创建和退出时调用函数?

    include
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe

随机推荐

  • 用python实现英文字母和相应序数转换

    用python实现英文字母和相应序数转换 第一步 字母转数字 英文字母转对应数字相对简单 可以在命令行输入一行需要转换的英文字母 然后对每一个字母在整个字母表中匹配 并返回相应的位数 然后累加这些位数即可 过程中 为了使结果更有可读性 输出
  • Linux USB摄像头使用

    Linux USB摄像头使用 一 使用V4l2工具调试摄像头 1 v4l2 ctl 常用操作 安装V4l2工具包 sudo apt install v4l utils 通过v4l2查看摄像头设备 sudo v4l2 ctl list dev
  • 在Java中产生随机数的两个方法

    一 利用random方法来生成随机数 在Java语言中生成随 机数相对来说比较简单 因为有一个现成的方法可以使用 在Math类中 Java语言提供了一个叫做random的方法 通过这个方法可以让系统产生随机 数 不过默认情况下 其产生的随机
  • C语言多级指针含义归纳

    前言 今天在实习二叉排序树的结点删除时 用到了三级指针 一下子有些困惑了 一番思考 才觉得对指针的理解更透彻了 条理地总结一下 从多个角度来分析 可以让思路更清晰 不同角度的含义单独来看不复杂 但是组合在一起就容易使我们陷入困惑 理解了各个
  • ctfshow_web175

    此文章是为了记录本人对知识理解 如有错误望敬请指出并谅解 打开场景可以看到在本题中 页面的拦截方式做了改变 检查结果是否有flag if preg match x00 x7f i json encode ret ret msg 查询成功 x
  • C语言写游戏——扫雷

    实现效果比较简陋 如图 写游戏需要不同的文件构成 首先看一下资源管理器清楚框架结构 在test c文件里编写整个游戏的运行逻辑 具体代码 define CRT SECURE NO WARNINGS 1 include game h 测试游戏
  • 数据决定AIGC的高度,什么又决定着数据的深度?

    有人曾言 数据决定人工智能发展的天花板 深以为然 随着ChatGPT等AIGC应用所展现出的强大能力 人们意识到通用人工智能的奇点正在来临 越来越多的企业开始涌入这条赛道 在AIGC浪潮席卷全球之际 数据的重要性也愈发被业界所认同 之所以会
  • Linux-挖矿木马清理

    一 什么是挖矿木马 挖矿木马会占用CPU进行超频运算 从而占用主机大量的CPU资源 严重影响服务器上的其他应用的正常运行 黑客为了得到更多的算力资源 一般都会对全网进行无差别扫描 同时利用SSH爆破和漏洞利用等手段攻击主机 部分挖矿木马还具
  • ConstraintLayout系列:ConstraintLayout实现左右均分布局

    效果图 关键代码 android layout width 0dp 0dp在ConstraintLayout中的含义是match constraint 完整代码
  • CTex的基本用法

    主要内容 Latex简介 命令和环境 文档排版和组织 普通文本编辑 数学公式编辑 图形 插图 表格 文献等的编辑 一 Latex简介 1 概述 首先要从TEX介绍起 TEX是斯坦福大学的教授Donald E Knuth 图灵奖获得者 开发的
  • django.db.utils.DataError: (1406, “Data too long for column ‘name‘ at row 1“)

    报错现象 django db utils DataError 1406 Data too long for column name at row 1 排除故障 当时第一反应是上网百度 结果搜出来的结果都是改字符集 但明显我这个和字符集关系不
  • 单片机语音识别原理

    语音识别是一门交叉学科 近二十年来 语音识别技术取得显著进步 开始从实验室走向市场 人们预计 未来10年内 语音识别技术将进入工业 家电 通信 汽车电子 医疗 家庭服务 消费电子产品等各个领域 语音识别听写机在一些领域的应用被美国新闻界评为
  • 基于SSM框架的多文件上传Controller类编写

    前端代码
  • Spring Boot 从Json静态文件中读取数据

    Spring Boot 从Json静态文件中读取数据 在实体中 通常使用类似字典表的文件来表示属性 文件大都配置在配置文件中 也可以是静态文件 本次记录如何从静态json文件中读取所需字段 1 文件格式以及路径 2 加载文件 import
  • QT进程间通信 详细介绍

    在QT中 信号和槽的机制取代了这种繁杂的 易崩溃的对象通信机制 信号是当对象状态改变时所发出的 槽是用来接收发射的信号并响应相应事件的类的成员函数 信号和槽的连接是通过connect 函数来实现的 AD 1 QT通信机制 为了更好的实现QT
  • MVC三层架构

    1 什么是MVC Model View Controller 模型 视图 控制器 模型就是Java对应数据库的那些字段 实体类 视图 就是JSP页面 控制器 就是Servlet负责跳转页面 Controller作用 Controller其实
  • Android addview—动态添加view

    一 前言 在日常的开发中经常遇到需要动态添加子view的情况 addview是ViewGroup的特有方法 可以在布局中动态添加view 而view是不存在这个方法的 二 使用方式 1 方法介绍 addview有以下几种方式 addView
  • vue+websocket+express+mongodb实战项目(实时聊天)(二)

    原项目地址 vue websocket express mongodb实战项目 实时聊天 一 http blog csdn net blueblueskyhua article details 70807847 github地址 https
  • JAVA按钮编程_Java编程实现swing圆形按钮实例代码

    Swing是一个为Java设计的GUI工具包 Swing是JAVA基础类的一部分 Swing包括了图形用户界面 GUI 器件如 文本框 按钮 分隔窗格和表 Swing提供许多比AWT更好的屏幕显示元素 它们用纯Java写成 所以同Java本
  • Linux——pthread_create()

    1 pthread create pthread create是 Unix Linux Mac OS X 等操作系统的创建线程的函数 它的功能是创建线程 实际上就是确定调用该线程函数的入口点 在线程创建以后 就开始运行相关的线程函数 函数原