【Linux 多线程】线程的4大基础操作(创建、等待、终止、分离)

news2025/2/26 2:52:16

目录

1.线程的创建 

 2.线程等待

 3.线程分离


线程共享一个地址空间 ,把资源(代码和数据)化成若干份,供各个线程使用

  • 线程的栈和上下文不是共享的
  • 以前学习的进程是具有一个线程的进程

 

1.线程的创建 

成功返回0,失败返回退出码 

#include<iostream>
#include<cstdio>
#include<pthread.h>
#include<unistd.h>
using namespace std;

void* thread_run(void* msg)
{
    char* tmp=(char*)msg;
    while(1)
    {
        printf("%s : %lu\n",tmp,pthread_self());//pthread_self:返回线程的id
        sleep(1);
    }
    return NULL;
}
int main()
{
    pthread_t id;
    pthread_create(&id,NULL,thread_run,(void*)"I am thread");//创建线程
    while(1)
    {
        printf("id: %lu\n",id);//%lu:32位无符号整形
        printf("I am mian thread : %lu\n",pthread_self());
        sleep(1);
    }
    return 0;
}

ps -aL:查看线程LWP(轻量级进程(Light Weight Process))

g++ -o $@ $^ -lpthread:编译要加pthread库

 2.线程等待

2.1.pthread_join

成功返回0,失败返回退出码 

#include<iostream>
#include<cstdio>
#include<pthread.h>
#include<unistd.h>
using namespace std;

void* thread_run(void* msg)
{
    char* tmp=(char*)msg;
    printf("%s : %lu\n",tmp,pthread_self());
    sleep(3);

    return (void*)520;//强转
}
int main()
{
    pthread_t id;
    pthread_create(&id,NULL,thread_run,(void*)"I am thread");

    printf("id: %lu\n",id);
    printf("I am mian thread : %lu\n",pthread_self());

    void* status=NULL;
    pthread_join(id,&status);
    printf("status: %d\n",(long long)status);//void*64位下8个字节

    return 0;
}

 2.2.线程终止的方案

  1. return退出线程(1.main线程退出,则进程退出;2.其他线程退出,则退出对应线程
  2. pthread__exit(1.main线程退出,则进程退出;2.其他线程退出,则退出对应线程);exit:退出进程
  3. pthread_cancel取消线程;进程取消的退出码:-1;

#include<iostream>
#include<cstdio>
#include<pthread.h>
#include<unistd.h>
using namespace std;

void* thread_run(void* msg)
{
    char* tmp=(char*)msg;
    printf("%s : %lu\n",tmp,pthread_self());
    sleep(3);
    return (void*)520;
}
int main()
{
    pthread_t id;
    pthread_create(&id,NULL,thread_run,(void*)"I am thread");

    void* status=NULL;
    pthread_cancel(id);//取消进程
    pthread_join(id,&status);
    printf("status: %d\n",(long long)status);
    return 0;
}

 

 3.线程分离

  • 线程分离后,执行结束会自动释放
#include<iostream>
#include<cstdio>
#include<pthread.h>
#include<unistd.h>
using namespace std;

void* thread_run(void* msg)
{
    pthread_detach(pthread_self());//线程分离
    char* tmp=(char*)msg;
    return (void*)520;
}
int main()
{
    pthread_t id;
    pthread_create(&id,NULL,thread_run,(void*)"I am thread");

    void* status=NULL;
    sleep(1);
    int ret=pthread_join(id,&status);//线程等待
    printf("ret: %d,status: %d\n",ret,(long long)status);

    return 0;
}

线程分离后不能等待线程 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一章:初始化react项目+antd+less

初始化react项目 我们首先使用react脚手架创建一个项目 Ant Design less creact-react-app中文文档 creact-react-app demo生产环境打包运行 当我们执行了 npm run build 打包后直接访问index.html 看效果白屏 这时候就需要安装一个serve包 npm install -g serve当我们安…

操作系统(二):死锁的检测,死锁的恢复和死锁的预防

文章目录零、什么是死锁一、死锁检测1. 对每种类型一个资源的死锁检测2. 对每种类型多个资源的死锁检测二、死锁恢复三、死锁预防四、死锁避免1 面向单个资源的银行家算法2 面向多个资源的银行家算法总结银行家算法的核心就是避免系统进行系统资源分配的不安全状态零、什么是死…

Zipkin : Golang 微服务全链路监控(二)

Zipkin : Golang 微服务全链路监控&#xff08;二&#xff09; Golang 微服务全链路监控实现 broker-service -> auth-service -> postgres dbzipkin 监控&#xff1a;需代码入侵 一、auth-service 通过 context 传递 span main.go package mainimport ("broke…

CSDN 编辑器 Marddown 语法备忘

原文链接&#xff1a;https://blog.csdn.net/blogdevteam/article/details/103478461 本文对其二次加工&#xff0c;增加渲染样式、补充例程、添加未收录的常用语法。 CSDN Markdown 编辑器遵循 CommonMark spec 语法规范。 快捷键 撤销&#xff1a;Ctrl/Command Z 重做&…

成都链安受邀参加第五届CCF中国区块链技术大会

2月10-12日&#xff0c;由中国计算机学会主办的&#xff0c;2023年国内首场大型区块链学术会议—第五届CCF中国区块链技术大会在无锡市成功举办&#xff0c;成都链安作为区块链安全头部企业受邀参加此次大会。大会上&#xff0c;成都链安创始人&CTO郭文生教授与锡东新城商务…

微信小程序开发(五)小程序代码组成2

微信小程序开发&#xff08;五&#xff09;小程序代码组成2 为了进一步加深我们对小程序基础知识的了解和掌握&#xff0c;需要更进一步的了解小程序的代码组成以及一些简单的代码的编写。 参考小程序官方的的代码组成文档&#xff1a;https://developers.weixin.qq.com/ebook?…

海量并发低延时 RTC-CDN 系统架构设计(上)

随着近几年音视频流媒体行业的持续发展&#xff0c;海量并发、低延时和低成本作为三大核心诉求依旧需要不断深挖&#xff0c;同时随着 RTC 和 CDN 这两种技术的界线越来越模糊&#xff0c;因此有必要从底层架构层面重新思考 RTC 与 CDN 的融合之道。本文将重点分享&#xff1a;…

通过 Colab 下载 Google Driver 上的大文件到内网服务器

这里写自定义目录标题1. 将 Google Driver 上的大文件下载到 Colab1.1 获取文件唯一的 fileID1.2 查看文件的 MD5 值1.3 获取 API 的 Access Token1.4 下载文件到 Colab2. 将文件从 Colab 下载到公网服务器3. 将文件从公网服务器下载到内网服务器4. 参考链接由于众所周知的原因…

【正点原子FPGA连载】第十章PS SYSMON测量温度电压实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十章PS SYSMON…

如何正确的在Flutter中添加webview

前言 为什么要在flutter中引入webview&#xff1f;这不是废话么&#xff0c;当然是为了加载一个网页&#xff0c;这不是移动端最基本的需求么&#xff0c;哈哈&#xff01;说的真不错&#xff0c;接下来我要是告诉你我的用法&#xff0c;你可能要大吃一惊。我的用处很简单&…

【音视频处理】码率、帧率越高越清晰?分辨率、像素、dpi之间是什么关系?码率的真实作用,I帧、B帧、P帧是什么

大家好&#xff0c;欢迎来到停止重构的频道。本期我们介绍一下视频的一些基础概念&#xff0c;如帧率、码率、分辨率、像素、dpi、视频帧、I帧、P帧、gop等。会解释多少码率是清晰的&#xff0c;是否帧率越高越流畅等问题。这些概念是比较杂乱的&#xff0c;我们按这样的顺序介…

Seata源码学习(四)-数据源代理

Seata源码分析-数据源代理 上节课我们分析了整体的Seata-AT模式的2PC执行流程&#xff0c;那么这节课我们要分析的就是在AT模式中的关键点&#xff0c;数据源代理 AT模式的核心点&#xff1a; 获取全局锁、开启全局事务解析SQL并写入undolog 那么上节课其实我们已经把第一步…

【目标检测】K-means和K-means++计算anchors结果比较(附完整代码,全网最详细的手把手教程)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 一、介绍 YOLO系列目标检测算法中基于anchor的模型还是比较多的,例如YOLOv3、YOLOv4、YOLOv5等,我们可以随机初始化a…

简约精美电商小程序【源码好优多】

简介 一款开源的电商系统&#xff0c;包含微信小程序和H5端&#xff0c;为大中小企业提供移动电子商务优秀的解决方案。 后台采用Thinkphp5.1框架开发&#xff0c;执行效率、扩展性、稳定性值得信赖。并且Jshop小程序商城上手难度低&#xff0c;可大量节省定制化开发周期。 功…

设计模式(适配器模式)

设计模式&#xff08;适配器模式&#xff09; 第二章 设计模式之适配器模式&#xff08;Adapter&#xff09; 一、Adapter模式介绍 适配器模式位于实际情况和需求之间&#xff0c;填补两者之间的差距。 二、示例程序1&#xff08;使用继承的适配器&#xff09; 1.示例程序示…

操作系统(五):编译过程,静态链接,目标文件,动态链接

文章目录一、程序的编译过程二、静态链接三、目标文件四、动态链接一、程序的编译过程 在linux上编译一个c文件hello.c的命令为: g -o hello hello.c 整个过程大致要经过一下四步: 预处理 &#xff1a; 处理以#开头的预处理命令编译 &#xff1a; 翻译成汇编文件汇编 &…

HTTPS基础原理和配置-3

书接上文&#xff1a;HTTPS 基础原理和配置 - 2&#xff0c;接下来介绍&#xff1a; 配置 NGINX后端 HTTPS检查配置配置 HSTSOCSP Stapling 重要部分来了。如何使用这些选项并配置NGINX? 一、NGINX 的 HTTPS 配置 这里有一些基本的原语&#xff08;或叫做指令&#xff09;…

GEE学习笔记八十八:在自己的APP中使用绘制矢量(上)

在GEE中尤其是自己的APP中调用绘制的矢量图形方法之前没有合适的方法&#xff0c;但是现在可以通过ui.Map.DrawingTools(...)以及ui.Map.GeometryLayer(...)结合来做。具体的API如下图&#xff1a; 在这一篇中我先通过一个简单的例子来展示一下使用这些API后可以实现什么效果&a…

C#底层库--日期扩展类(上周、本周、明年、前年等)

系列文章 C#底层库–记录日志帮助类 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/124187709 C#底层库–数据库访问帮助类&#xff08;MySQL版&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126886379 …

axios中的GET POST PUT PATCH,发送请求时params和data的区别

axios 中 get/post请求方式 1. 前言 最近突然发现post请求可以使用params方式传值&#xff0c;然后想总结一下其中的用法。 2.1 分类 经过查阅资料&#xff0c;get请求是可以通过body传输数据的&#xff0c;但是许多工具类并不支持此功能。 在postman中&#xff0c;选择get请…