首页 > 系统相关 >Linux环境C语言pthread多线程

Linux环境C语言pthread多线程

时间:2024-09-12 16:24:54浏览次数:7  
标签:调用 函数 主线 回收 C语言 线程 pthread 多线程

pthread线程库介绍

pthread 库是 POSIX 线程(Portable Operating System Interface for uniX threads)库的简称,它提供了一套创建和管理线程、以及线程间同步的机制。pthread 库是 UNIX 系统上实现多线程编程的一个标准接口,也被广泛支持在类 UNIX 系统(Linux 和 macOS)中。


头文件

#include <pthread.h>

1.创建线程

新建线程id对象

pthread_t t1;

获取线程id

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

创建线程函数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

参数1:线程id对象的指针,创建线程成功时,将线程id写入这个指针指向的内存中
参数2:线程的属性, 一般情况下使用默认属性即可, 写NULL
参数3:函数指针,是回调函数,线程运行时执行该函数
参数4:线程执行函数的参数,多参数可用结构体传入
返回值:函数执行成功返回0,失败返回对应的错误号

2.线程退出

如果想让线程退出,又需要等待其他子线程,不立即释放虚拟地址的内存(针对主线程),就可以调用线程退出函数。只要调用该函数当前线程就马上退出了,并且不会影响到其他线程的正常运行,不管是在子线程或者主线程中都可以使用

void pthread_exit(void *retval);

参数:线程退出的时候携带的数据,当前子线程的主线程会得到该数据。如果不需要使用,指定为NULL

3.线程回收

子线程退出的时候其内核资源主要由主线程回收,主线程可调用pthread_join()来回收自行车资源。
如果还有子线程在运行,调用该函数就会阻塞,子线程退出函数解除阻塞进行资源的回收,函数被调用一次,只能回收一个子线程,如果有多个子线程则需要循环进行回收。

int pthread_join(pthread_t thread, void **retval);

参数1:要被回收的子线程的线程ID
参数2:二级指针, 指向一级指针的地址, 是一个传出参数, 这个地址中存储了子线程pthread_exit() 传递出的数据,如果不需要这个参数,可以指定为NULL
返回值:线程回收成功返回0,回收失败返回错误号

回收子线程数据

子线程退出的时候可以使用pthread_exit()的参数将数据传出,在回收这个子线程的主线程中可以通过phread_join()的第二个参数来接收子线程传递出的数据。接收数据有如下多种处理方式

  • 使用子线程栈
    子线程回调函数中,创建存储数据的结构体,通过pthread_exit()传出。主线程通过phread_join()的第二个参数来获取数据。
  • 使用全局变量
    位于同一虚拟地址空间中的线程,虽然不能共享栈区数据,但是可以共享全局数据区和堆区数据,因此在子线程退出的时候可以将传出数据存储到全局变量、静态变量或者堆内存中。不推荐使用全局变量,动态创建/销毁子线程时使用全局变量来回收数据也不可行。
  • 使用主线程栈
    主线程创建主线程时通过pthread_create()的第四个参数将存储数据的结构体传给子线程,子线程写入数据后通过pthread_exit()传出。

4.线程分离

在某些情况下,程序中的主线程有属于自己的业务处理流程,如果让主线程负责子线程的资源回收,调用pthread_join()只要子线程不退出主线程就会一直被阻塞,主要线程的任务也就不能被执行了。

在线程库函数中为我们提供了线程分离函数pthread_detach(),调用这个函数之后指定的子线程就可以和主线程分离,当子线程退出的时候,其占用的内核资源就被系统的其他进程接管并回收了。线程分离之后在主线程中使用pthread_join()就回收不到子线程资源了。

int pthread_detach(pthread_t thread);

主线程中调用了pthread_detach()后,主线程可以不用调用pthread_join()回收子线程了,子线程回调函数中可以调用pthread_exit()或者在return NULL执行完毕时退出

5.其他线程函数

5.1线程取消

在线程A中想要杀死另外一个线程B,分为两个步骤:

  1. 在线程A中调用pthread_cancel(),指定线程B的线程ID,但线程B不会被立即杀死
  2. 在线程B中进程一次系统调用(从用户区切换到内核区),否则线程B可以一直运行
int pthread_cancel(pthread_t thread);

参数:要杀死的线程的线程ID
返回值:函数调用成功返回0,调用失败返回非0错误号

  • 系统调用:直接调用Linux系统函数,C/C++的库函数如printf、scanf会调用相关的系统函数

5.2线程ID比较

Linux中线程ID本质就是一个无符号长整形,因此可以直接使用比较操作符比较两个线程的ID,但是线程库是可以跨平台使用的,在某些平台上 pthread_t可能不是一个单纯的整形,这中情况下比较两个线程的ID必须要使用比较函数

int pthread_equal(pthread_t t1, pthread_t t2);

参数:t1 和 t2 是要比较的线程的线程ID
返回值:如果两个线程ID相等返回非0值,如果不相等返回0



本文为总结归纳个人笔记,转载自爱编程的大丙的博客

标签:调用,函数,主线,回收,C语言,线程,pthread,多线程
From: https://www.cnblogs.com/cpp101/p/18404098

相关文章

  • 基于javaC语言试题生成与考试系统的计算机毕设
    C语言试题生成与考试系统摘 要当前,网络教学方兴未艾。网上考试已在其中扮演了重要的角色,传统试卷考试方式有待提高。网络教学已从其规范性、科学性及考试工作组织、管理的统一性,影响到教学质量的好坏。基于此,本系统开发实现了基于B/S模式的c试题生成与考试系统,其中数据库采用MYSQ......
  • C语言深入理解指针六(19)
    文章目录前言一、sizeof&strlensizeofstrlensizeof和strlen的对比二、数组和指针笔试题解析一维数组字符数组二维数组三、指针运算笔试题解析题目1题目2题目3题目4题目5题目6题目7总结前言  本篇都将是练习题,从而让你对指针的理解更上一层楼一、sizeof&s......
  • C语言进阶【3】---C语言内存函数
    本章概述本章函数概述memcpy使用和模拟memmove使用和模拟memset函数的使用memcmp函数的使用彩蛋时刻!!!本章函数概述我们在本章的博客中讲的内容是有关内存的操作,我们直接通过内存块对数据进行操作。因为我们是直接对内存块操作,所以可以对任意类型数据进行操作(我们没......
  • 【C语言基础】数据类型、运算符和表达式
    1数据类型基本类型整型:短整型,基本整型,长整型字符型实型(浮点型):单精度型,双精度型枚举类型构造类型:是使用基本类型的数据或者使用已经构造好的数据类型,进行添加、设计构造出新的数据类型,使其设计的新构造类型满足待解决问题所需要的数据类型。数组类型结构体类型共用体类......
  • 视频监控推流助手/极低延迟/支持N路批量多线程推流/264和265推流/监控转网页
    一、前言说明搞视频监控开发除了基本的拉流以外,还有个需求是推流,需要将拉到的流重新推流到流媒体服务器,让流媒体服务做转发和负载均衡,这样其他地方只需要问流媒体服务器要视频流即可。为什么拉了又重新推呢,因为软件这边和可能拉流后做了处理,比如做了人工智能运算,识别到了物体方框......
  • C语言15--联合体与枚举
    联合体(共同体)基本概念        联合体的外在形式跟结构体非常类似,但它们有一个本质的区别:结构体中的各个成员是各自独立的内存空间,而联合体中的各个成员却共用同一块内存,因此联合体也称为共用体。联合体各成员的堆叠效果联合体内部成员的这种特殊的“堆叠”效果,使......
  • java使用多线程
    importjava.util.concurrent.TimeUnit;importcn.hutool.core.thread.ExecutorBuilder;importcn.hutool.core.thread.ThreadFactoryBuilder;//构造多线程,可修改线程数ExecutorServiceexecutorService=ExecutorBuilder.create().setCorePoolSize(5)//初始线程......
  • 说下Python中的各个多线程模块之间的区别
    在Python中,涉及多线程的主要模块有threading、thread(在Python2.x中使用)和concurrent.futures。以下是这些模块之间的详细区别:1.threading模块简介:threading是Python的标准库之一,提供了创建和管理线程的高级接口。特点:线程类:提供Thread类,用户可以通......
  • Python中的 GIL是什么?它如何影响多线程?
    GIL(GlobalInterpreterLock)GIL(全局解释器锁)是Python解释器(特别是CPython实现)中的一个机制,用于管理对Python对象的访问。由于Python的内存管理不是线程安全的,GIL确保在任意时刻只有一个线程可以执行Python字节码,从而避免了多个线程同时访问和修改对象造成的数据不一致......
  • 【C语言加油站】你真的知道什么是文件吗?今天咱们就来好好认识一下文件
    文件操作导读一、什么是文件?1.1日常生活中的文件1.2计算机中的文件1.3文件的分类1.4文件的名字二、为什么要有文件三、如何使用文件?结语导读大家好,很高兴又和大家见面啦!!!在今天的内容中,我们就会介绍C语言中的文件操作。在开始今天的内容之前,我先问一下大家,你......