Linux线程——常用API

news2024/11/27 9:56:56

线程创建

函数原型及头文件

#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);

参数解读

                tidp当pthread_create成功返回时,由tidp指向的内存单元被设置为新创建线程的线程ID。(指针,输入方式是地址)
                attr一般设为NULL。attr参数用于定制各种不同的线程属性,暂可以把它设置为NULL,以创建默认属性的线程。
(*start_rtn)(void *)新创建的线程的入口地址。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数arg。
                arg向start_rtn函数传递的参数。如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg参数传入。(指针,输入方式是地址,同时要注意是void *型)

返回值

若成功返回0,否则返回错误编号。

线程退出

单个线程可以通过以下三种方式退出,在不终止整个进程的情况下停止它的控制流:

1)线程只是从启动例程中返回,返回值是线程的退出码

2)线程可以被同一进程中的其他线程取消。

3)线程调用pthread_exit

函数原型及头文件

#include <pthread.h>
int pthread_exit(void *rval_ptr);

参数解读

rval_ptr:一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过调用pthread_join函数访问到这个指针。

线程等待

调用这个函数的线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消。如果例程只是从它的启动例程返回i,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED。

可以通过调用pthread_join自动把线程置于分离状态,这样资源就可以恢复。如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL。

函数原型及头文件

#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);

参数解读

thread线程名
**rval_ptr线程的返回值。如果对线程的返回值不感兴趣,可以把rval_ptr置为NULL。在这种情况下,调用pthread_join函数将等待指定的线程终止,但并不获得线程的终止状态。

返回值

若成功返回0,否则返回错误编号。

线程脱离

函数原型及头文件

#include <pthread.h>
int pthread_detach(pthread_t thread);

参数解读

一个线程或者是可汇合(joinable,默认值),或者是脱离的(detached)。当一个可汇合的线程终止时,它的线程ID和退出状态将留存到另一个线程对它调用pthread_join。脱离的线程却像守护进程,当它们终止时,所有相关的资源都被释放,我们不能等待它们终止。如果一个线程需要知道另一线程什么时候终止,那就最好保持第二个线程的可汇合状态。

pthread_detach函数把指定的线程转变为脱离状态。

返回值

若成功返回0,否则返回错误编号。

其他

本函数通常由想让自己脱离的线程使用,就如以下语句:

pthread_detach(pthread_self());

线程ID获取

函数原型及头文件

#include <pthread.h>
pthread_t pthread_self(void);

返回值

调用线程的ID。

线程比较

对于线程ID比较,为了可移植操作,我们不能简单地把线程ID当作整数来处理,因为不同系统对线程ID的定义可能不一样。

函数原型及头文件

#include <pthread.h>
int pthread_equal(pthread_t tid1, pthread_t tid2);

参数解读

tid1线程1的名字
tid2线程1的名字

返回值

若相等则返回非0值,否则返回0。

代码示例

线程返回数字打印

#include <stdio.h>
#include <pthread.h>

void *func1(void *arg)
{
	static int ret = 1;//static保留数据 不然函数调用后空间无效
    printf("t1:this thread t1:%ld \n",(unsigned long)pthread_self());//self是void型 需对其进行强转
    printf("t1:num=%d\n",*((int *)arg));//传参过来的是主函数的num num取地址传过来需先将void型转成int型 再通过指针指向其地址得到数据
	pthread_exit((void *)&ret);//线程的退出 可附带线程的返回值 可通过pthread_join调用得到该数据
}
int main()
{
        int ret;
        int num =999;
	    int *pret;
        pthread_t t1;

        ret = pthread_create(&t1,NULL,func1,(void *)&num);//第四个参数是void *型 而num是int型 需要对其进行强转 同时其输出为指针 则需要加上地址符号
        if(ret == 0)//判断线程是否创建成功
	    {
            printf("main:create thread success\n");
        }
        printf("main:%ld\n",(unsigned long)pthread_self());	

	    pthread_join(t1,(void **)&pret);//线程等待 等待上面函数退出之后再执行下面语句
	    printf("main:ti quit %d\n",*pret);//打印出线程的返回值
        return 0;
}

线程返回字符串打印

#include <stdio.h>
#include <pthread.h>

void *func1(void *arg)
{
	static char *p = "hello word";
    printf("t1:this thread t1:%ld \n",(unsigned long)pthread_self());
    printf("t1:num=%d\n",*((int *)arg));
	pthread_exit((void *)p);
}
int main()
{
    int ret;
    int num =999;
	char *pret;
    pthread_t t1;

    ret = pthread_create(&t1,NULL,func1,(void *)&num);
    if(ret == 0)
	{
        printf("main:create thread success\n");
    }
    printf("main:%ld\n",(unsigned long)pthread_self());	

	pthread_join(t1,(void **)&pret);
	printf("main:ti quit %s\n",pret);//字符串的名字为地址 不需要加地址符
    return 0;
}

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

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

相关文章

通过基准配置文件(Baseline Profiles)提升你的Android应用性能

通过基准配置文件提升你的Android应用性能 应用程序性能与用户体验直接相关&#xff0c;具有至关重要的意义。在开发者社区中&#xff0c;存在许多方法来提高应用程序性能。在本文中&#xff0c;您将通过利用基准配置文件&#xff08;Baseline Profile&#xff09;深入了解其中…

采购oled屏幕,应注意什么

在采购OLED屏幕时&#xff0c;应注意以下几点&#xff1a; 规格和参数&#xff1a;了解OLED屏幕的规格和参数&#xff0c;包括尺寸、分辨率、亮度、对比度、响应时间等。确保所采购的屏幕符合项目的需求和预期效果。 品质和可靠性&#xff1a;选择具有可靠品质和稳定性的OLED屏…

Spirng02

一、Spring中Bean的生命周期 当我们启动Spring项目的时候,就会初始化Spring的容器,Spring就会扫描启动引导类所在包及其子包中类的注解,并调用这些加了注解的类的构造方法创建对象(控制翻转),再创建了这些类的对象之后,就会找使用了Autowired注解的地方进行赋值(依赖注入)。随后…

如何访问AWS私有网络中的RDS (Mysql)

文章目录 小结问题及解决连接问题如何使用本地的Mysql Workbench对RDS进行访问 参考 小结 在AWS私有网络中部署了RDS (Mysql), 尝试通过外网成功地进行了访问. 问题及解决 连接问题 在AWS私有网络中部署了RDS (Mysql), 进行外网进行访问碰到了各种问题. 以下连接超时&…

ARM-----DMA笔记

1.DMA简介 DMA(Direct Memory Access) —直接存储器存取&#xff0c;是单片机的一个外设&#xff0c;它的主要功能是用来搬数 据&#xff0c;但是不需要占用 CPU &#xff0c;即在传输数据的时候&#xff0c; CPU 可以干其他的事情&#xff0c;好像是多线程一样。 数据传输支持…

computed 和 watch 的奇妙世界:让数据驱动你的 Vue 应用(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

RAG检索增强技术在知识库智能检索场景下的应用实践

如果你对这篇文章感兴趣&#xff0c;而且你想要了解更多关于AI领域的实战技巧&#xff0c;可以关注「技术狂潮AI」公众号。在这里&#xff0c;你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、知识检索增强的基本概述 1.1、知识检索增强技术提出的背景 1.1.1、L…

【AD封装】2.0间距排针排母插件贴片(带3D)

包含了我们平时常用的2.0间距的排针&#xff0c;排母&#xff0c;贴片的插件的都有&#xff0c;总共100种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 2.0排针排母是一种电子连接器&#xff0c;通常用于电路板上的电子元件之间的连接。它由一…

【Python】人工智能-机器学习——不调库手撕贝叶斯分类问题

1. 作业内容描述 1.1 背景 数据集大小150该数据有4个属性&#xff0c;分别如下 Sepal.Length&#xff1a;花萼长度(cm)Sepal.Width&#xff1a;花萼宽度单位(cm)Petal.Length&#xff1a;花瓣长度(cm)Petal.Width&#xff1a;花瓣宽度(cm)category&#xff1a;类别&#xff0…

深入理解Spring Security授权机制原理

原创/朱季谦 在Spring Security权限框架里&#xff0c;若要对后端http接口实现权限授权控制&#xff0c;有两种实现方式。 一、一种是基于注解方法级的鉴权&#xff0c;其中&#xff0c;注解方式又有Secured和PreAuthorize两种。 Secured如&#xff1a; 1 PostMapping("…

推荐几款值得收藏的3DMAX插件

推荐几款值得收藏的3DMAX插件 StairGenerator StairGenerator一键楼梯插件&#xff0c;不需要花费太多的时间&#xff0c;轻松从2D平面图生成3D楼梯模型&#xff0c;生成的楼梯模型细节丰富真实。 【主要功能】 1.简单&#xff1a;轻松实现2D到3D建模。 2.具有最详细三维结…

六:爬虫-数据解析之BeautifulSoup4

六&#xff1a;bs4简介 基本概念&#xff1a; 简单来说&#xff0c;Beautiful Soup是python的一个库&#xff0c;最主要的功能是从网页抓取数据官方解释如下&#xff1a; Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。 它是一个工具箱…

中断响应,解决死锁的例子

对于关键字synchronized来说&#xff0c;如果一个线程在等待锁&#xff0c;那么结果只有两种情况&#xff0c;要么它获得这把锁继续执行&#xff0c;要么它就保持等待。而使用重入锁&#xff0c;则提供另外一种可能&#xff0c;那就是线程可以被中断。也就是在等待锁的过程中&a…

【Java 集合】ArrayBlockingQueue

ArrayBlockingQueue, 顾名思义: 基于数组的阻塞队列, 位于 JUC (java.util.concurrent) 下, 是一个线程安全的集合, 其本身具备了 不支持 null 元素: 存入 null 元素会抛出异常固定容量: 在初始化时需要指定一个固定的容量大小。这意味着一旦队列达到最大容量&#xff0c;将不再…

去除Antd组件库中上传文件中的一些默认样式

最近写的项目用到了antd组件库中的Upload了 <><Upload {...UploadProps} classNamechooseFile><Button style{{ marginRight: 8px }}>选择文件</Button></Upload><Button type"primary" onClick{upload}>开始上传</Button&g…

YOLOv8代码下载及环境配置

Github 下载YOLOv8官方代码进入Miniconda pytorch虚拟环境&#xff0c;或者用Pycharm打开文件进入虚拟环境&#xff0c;切换到YOLOv8代码目录&#xff0c;输入pip install -r requirements.txt 安装YOLOv8环境。 如果报错&#xff1a;WARNING: Ignore distutils configs in set…

高级桌面编程(一)

前言 学习心得&#xff1a;C# 入门经典第8版书中的第15章《高级桌面编程》 创建控件并设置样式 1 样式 Style WPF 当中我们可以对每一个控件进行完全的自定义。我们可以随意更改控件外观和功能。提供我们能完成这样的效果与控件的样式&#xff08;Style&#xff09;有着不可分…

OpenCV技术应用(8)— 如何将视频分解

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何将一幅图像转化成热力图&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 视频是…

蚂蚁SEO强引蜘蛛是什么

强引蜘蛛在网页中是指一些特殊类型的网页&#xff0c;这些网页具有极高的吸引力和价值&#xff0c;能够吸引搜索引擎蜘蛛&#xff08;Spider&#xff09;的强烈关注和抓取。强引蜘蛛的网页通常具有以下特点&#xff1a; 如何联系蚂蚁seo&#xff1f; baidu搜索&#xff1a;如…

C++ Qt开发:ComboBox下拉组合框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍ComboBox下拉组合框组件的常用方法及灵活运用…