Linux--线程 创建、等待、退出

Linux上线程开发API概要

多线程开发的最基本概念主要包含:线程,互斥锁,条件。

线程 3 种操作:线程的创建,退出,等待。

互斥锁 4 种操作:创建,销毁,加锁和解锁。

条件 5 种操作:创建,销毁,触发,广播和等待。

图片引用https://www.cnblogs.com/xiehongfeng100/p/4620852.html

一、线程的创建、退出及等待

1、创建

编译时:gcc 文件 -pthread

(多线程开发在 Linux 平台上已经有成熟的 pthread 库支持。)

c 复制代码
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
//指向pthread_t的长整型指针,线程的属性,函数的指针,传参的参数
// 返回:若成功返回0,否则返回错误编号

当pthread_create成功返回时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于定制各种不同的线程属性,暂可以把它设置为NULL,以创建默认属性的线程。

新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数arg。如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg参数传入。

2、退出:

c 复制代码
#include <pthread.h>
int pthread_exit(void *rval_ptr);
//rval_ptr是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过调用pthread_join函数访问到这个指针。

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

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

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

3)线程调用pthread_exit:

3、等待:

join 可以接收 exit 退出的返回值

c 复制代码
#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号

4、脱离5、线程ID获取参考资源参考地址

6、例:

c 复制代码
//线程

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

void *func1(void *arg)
{
	static int ret = 10;
	
	printf("ti: %ld thread is create!\n",(unsigned long)pthread_self());
	printf("ti: param is %d \n",*((int *)arg));
	
	//退出
	pthread_exit((void *)&ret)
}

int main()
{
	int ret;
	int param = 100;
	pthread_t t1;
	
	int *pret = NULL;
	
	//创建线程
	ret = pthread_create(&t1,NULL,func1,(void *)&param);//调用func1函数
	if(ret == 0){
		printf("main: create t1 success! \n");
	}
	
	printf("main: %ld\n",(unsigned long)pthread_self());
	
	//等待
	pthread_join(t1,(void **)&pret);
	
	printf("main: t1 quit:%d !\n",*pret);
	
	return 0;
}

运行结果:

bash 复制代码
main: create t1 success!
main: 139839630968576
ti: 139839622682368 thread is create!
ti: param is 100
main: t1 quit:10 !

资源参考地址: https://www.cnblogs.com/xiehongfeng100/p/4620852.html

相关推荐
wuicer2 小时前
ubuntu 20.04 安装anaconda以及安装spyder
linux·运维·ubuntu
安卓开发者3 小时前
Android RxJava 组合操作符实战:优雅处理多数据源
android·rxjava
cui__OaO3 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
小狗爱吃黄桃罐头3 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
阿华的代码王国3 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼3 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jerry说前后端4 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化
小晶晶京京4 小时前
day34-LNMP详解
linux·运维·服务器
画个太阳作晴天4 小时前
A12预装app
linux·服务器·前端
fengyehongWorld4 小时前
Linux crontab定时任务
linux·运维