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

相关推荐
louisgeek10 分钟前
Android Charles Proxy 抓包
android
HZero.chen30 分钟前
Linux字符串处理
linux·string
张童瑶31 分钟前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功12336 分钟前
什么是SELinux
linux
石小千42 分钟前
Linux安装OpenProject
linux·运维
柏木乃一1 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-30901 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu
代码or搬砖1 小时前
Nginx详讲
运维·nginx·dubbo
守城小轩1 小时前
基于Chrome140的Quora账号自动化——运行脚本(三)
运维·自动化·chrome devtools·指纹浏览器·浏览器开发
百年渔翁_肯肯1 小时前
Linux 与 Unix 的核心区别(清晰对比版)
linux·运维·unix