【Linux】C语言中多线程的创建、退出、回收、分离

您所在的位置:网站首页 pthread详解 【Linux】C语言中多线程的创建、退出、回收、分离

【Linux】C语言中多线程的创建、退出、回收、分离

2023-06-24 06:54| 来源: 网络整理| 查看: 265

概述

线程是轻量级的进程(LWP:light weight process),在 Linux 环境下线程的本质仍是进程。在计算机上运行的程序是一组指令及指令参数的组合,指令按照既定的逻辑控制计算机运行。操作系统会以进程为单位,分配系统资源,可以这样理解,进程是资源分配的最小单位,线程是操作系统调度执行的最小单位。

在Linux系统下,线程的创建和管理是通过pthread库实现的。pthread是POSIX线程库,提供了创建、终止、同步和通信线程的函数和数据结构。

创建线程 线程函数

每一个线程都有一个唯一的线程 ID,ID 类型为 pthread_t,这个 ID 是一个无符号长整形数,如果想要得到当前线程的线程 ID,可以调用如下函数:

pthread_t pthread_self(void); // 返回当前线程的线程ID

在Linux系统下,可以使用pthread_create函数来创建线程。pthread_create函数的原型如下:

#include int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start_routine)(void*), void* arg); thread:指向pthread_t类型的指针,用于存储新创建线程的标识符。在成功创建线程后,该指针将被填充为一个唯一的标识符,用于后续对线程的引用。attr:指向pthread_attr_t类型的指针,用于指定线程的属性。线程属性对象可以控制线程的各种行为,例如线程的调度策略、栈大小、分离状态等。如果不需要对线程属性进行特殊设置,可以传入NULL,使用默认属性。start_routine:指向线程函数的指针,该函数是线程的入口点。线程函数是线程的实际执行体,当线程被创建时,将从该函数开始执行。函数的返回类型必须为void*,并接受一个void*类型的参数。线程函数可以执行任意操作,包括计算、访问共享资源等。arg:传递给线程函数的参数,类型为void*。可以将任意类型的数据传递给线程函数,只需将其转换为void*类型。在线程函数内部,可以使用适当的类型转换将参数恢复为原始类型。

返回值:线程创建成功返回 0,创建失败返回对应的错误号

在编写多线程程序的时候,如果想要让线程退出,但是不会导致虚拟地址空间的释放(针对于主线程),我们就可以调用线程库中的线程退出函数,只要调用该函数当前线程就马上退出了,并且不会影响到其他线程的正常运行,不管是在子线程或者主线程中都可以使用。

void pthread_exit(void *retval);

参数 retval 是一个指向任意类型的指针,表示线程的退出状态。线程的退出状态可以用于与其他线程进行通信或传递结果。

pthread_self() 是一个 POSIX 线程库函数,用于获取当前线程的线程 ID。

pthread_t pthread_self(void); 线程创建

注意:线程函数可以接受一个指向任意类型的参数,并且返回一个指向任意类型的指针。 首先使用vim pthread_create.c创建c语言文件。 键入代码:

#include #include #include #include #include void *callback(void* arg) { for(int i=0;i pthread_t tid; pthread_create(&tid,NULL,callback,NULL); for(int i=0;i int num; int age; }; void *callback(void* arg) { for(int i=0;i pthread_t tid; struct persion t; pthread_create(&tid,NULL,callback,&t); for(int i=0;i printf("子线程:i=%d\n",i); } printf("子线程:%ld\n",pthread_self()); struct persion* t = (struct persion*)arg; t->num=100; t->age=5; pthread_exit(&t); return NULL; } int main() { pthread_t tid; struct persion t; pthread_create(&tid,NULL,callback,&t); for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3