当前位置: 首页 > news >正文

Linux线程基础学习记录(线程的创建、回收以及结束)

0.线程特点

(1).线程共享资源:一个进程下的多个线程共享以下资源

                可执行的指令

                静态数据

                进程中打开的文件描述符

                当前工作目录

                用户ID

                用户组ID

(2).线程私有资源:

                线程ID

                PC(程序计数器)和相关寄存器

                堆栈

                错误号(errno)

                优先级

                执行状态和属性

一.C函数创建线程、回收线程、结束线程

1.创建线程 - pthread_create

功能

        创建一个线程,成功时返回(0),失败时返回错误码(errno)

参数:

        thread: 线程对象

        attr     : 线程属性,NULL则表示默认属性

        void*(*routine)(void*):线程执行的函数

        arg      :传递给线程执行函数的参数

int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*routine)(void*),void *arg);

                

2.线程回收 - pthread_join

功能:

        回收线程资源,成功时返回0,失败返回错误码。

        调用线程阻塞直到pthread结束

参数:

        thread   : 线程对象,指定要回收的线程

        retval    : 接收线程返回值的地址

int pthread_join(pthread_t thread,void **retval);

3.线程结束 - pthread_exit

功能

        结束当前的线程,释放该线程的私有资源。

参数

        retval: 可被其他线程通过 pthread_join 获取。

void pthread_exit(void *retval);

4.线程创建、回收、结束,代码示例

#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>char message[32] = "Hello World";
void *thread_func(void *arg);int main()
{pthread_t a_thread;        //创建线程对象void *result;              //用于接收线程返回值int ret;/* 创建线程,绑定线程执行函数 */ret = pthread_create(&a_thread,NULL,thread_func,NULL);if(0 != ret){printf("fail to pthread_create\n");exit(-1);}/* 阻塞等待回收线程资源 */pthread_join(a_thread,&result);            //将结果存入resultprintf("result is :%s\n",result);printf("message is :%s\n",message);return 0;
}/* 线程函数 */
void *thread_func(void *arg)
{sleep(1);printf("thread_func has been created\n");strcpy(message,"marked by thread_func\n");/* 结束线程 */pthread_exit("thank you for waiting for me\n");     //线程结束返回参数信息
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#中的S7协议
  • 【计算机网络】应用层自定义协议与序列化
  • 批量查询全国快递单号:高效追踪物流信息
  • HarmonyOS应用开发学习-ArkUI-容器组件
  • springboot的学习(二):常用配置
  • 【算法 04】汉诺塔递归求解和通式求解
  • 【Linux基础】Linux中的开发工具(1)--yum和vim
  • 【学习笔记】Day 11
  • C++11中的左右值引用(略带复习)
  • PyTorch 基础学习(1) - 快速入门
  • 从零开始搭建 LVS 高性能集群 (DR模式)
  • JAVA中的对象流ObjectInputStream
  • uniapp实现自定义弹窗组件,支持富文本传入内容
  • Linux:Linux环境基础开发工具使用
  • DIAdem 与 LabVIEW
  • C# 免费离线人脸识别 2.0 Demo
  • eclipse(luna)创建web工程
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Mocha测试初探
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Quartz初级教程
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • webpack入门学习手记(二)
  • 阿里云Kubernetes容器服务上体验Knative
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 动态魔术使用DBMS_SQL
  • 二维平面内的碰撞检测【一】
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #pragma pack(1)
  • (27)4.8 习题课
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (规划)24届春招和25届暑假实习路线准备规划
  • (六)Hibernate的二级缓存
  • (实战篇)如何缓存数据
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .bat批处理(一):@echo off
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net core使用ef 6
  • .net 验证控件和javaScript的冲突问题
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • :not(:first-child)和:not(:last-child)的用法
  • @开发者,一文搞懂什么是 C# 计时器!
  • @在php中起什么作用?
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [2]十道算法题【Java实现】
  • [20170728]oracle保留字.txt
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件