iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux pthread线程怎么创建与使用
  • 592
分享到

Linux pthread线程怎么创建与使用

2023-06-29 01:06:53 592人浏览 安东尼
摘要

本篇内容介绍了“linux pthread线程怎么创建与使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.前言线程与进程的区别 

本篇内容介绍了“linux pthread线程怎么创建与使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Linux pthread线程怎么创建与使用

1.前言

线程与进程的区别 

(1)进程: 是操作系统调度最小单位。 Linux下可以通过ps、top等命令查看进程的详细信息。 

(2)线程: 是进程调度的最小单位,每个进程都有一个主线程。在进程里主要做事情就是线程。

(3)在全系统中,进程ID是唯一标识,对于进程的管理都是通过PID来实现的。每创建一个进程,内核去中就会创建一个结构体来存储该进程的全部信息,每一个存储进程信息的节点也都保存着自己的PID。需要管理该进程时就通过这个ID来实现(比如发送信号)。当子进程结束要回收时(子进程调用exit()退出或代码执行完),需要通过wait()系统调用来进行,未回收的消亡进程会成为僵尸进程,其进程实体已经不复存在,但会虚占PID资源,因此回收是有必要的。

对于线程而言,若要主动终止需要调用pthread_exit() ,主线程需要调用pthread_join()来回收(前提是该线程没有设置 “分离属性”)。像线发送线程信号也是通过线程ID实现

进程间的通信方式: 

A.共享内存 B.消息队列 C.信号量 D.有名管道 E.无名管道 F.信号 G.文件 H.Socket 

线程间的通信方式: 

A.互斥量 B.自旋 C.条件变量 D.读写锁 E.线程信号 F.全局变量

进程间采用的通信方式要么需要切换内核上下文,要么要与外设访问(有名管道,文件)。所以速度会比较慢。而线程采用自己特有的通信方式的话,基本都在自己的进程空间内完成,不存在切换,所以通信速度会较快。也就是说,进程间与线程间分别采用的通信方式,除了种类的区别外,还有速度上的区别。

说明: 当运行多线程的进程捕获到信号时,只会阻塞主线程,其他子线程不会影响会继续执行。

2. 线程相关函数介绍

2.1 创建线程

pthread_create是Unix操作系统(Unix、Linux等)的创建线程的函数。 编译时需要指定链接库: -lpthread 函数原型

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

参数介绍

第一个参数为指向线程标识符的指针。 第二个参数用来设置线程属性。默认可填NULL。 第三个参数是线程运行函数的起始地址。 最后一个参数是运行函数的参数。不需要参数可填NULL。 Linux下查看函数帮助:# man pthread_create

Linux pthread线程怎么创建与使用

返回值: 若线程创建成功,则返回0。若线程创建失败,则返回出错编号。 线程创建成功后, attr参数用于指定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向线程工作函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。

示例:

#include <stdio.h>#include <pthread.h>//线程函数1void *pthread_func1(void *arg){    while(1)    {        printf("线程函数1正在运行.....\n");        sleep(2);    }}//线程函数2void *pthread_func2(void *arg){    while(1)    {        printf("线程函数2正在运行.....\n");        sleep(2);    }}int main(int arGC,char **argv){        pthread_t thread_id1;    pthread_t thread_id2;       if(pthread_create(&thread_id1,NULL,pthread_func1,NULL))    {        printf("线程1创建失败!\n");        return -1;    }        if(pthread_create(&thread_id2,NULL,pthread_func2,NULL))    {        printf("线程2创建失败!\n");        return -1;    }            pthread_join(thread_id1,NULL);    pthread_join(thread_id2,NULL);    return 0;}//gcc pthread_demo_code.c -lpthread

2.2 退出线程

线程通过调用pthread_exit函数终止执行,就如同进程在结束时调用exit函数一样。这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针。

这个函数的作用是,终止调用它的线程并返回一个指向某个对象的指针,该返回值可以通过pthread_join函数的第二个参数得到。

函数原型

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

参数解析 线程的需要返回的地址。 注意: 线程结束必须释放线程堆栈,就是说线程函数必须调用pthread_exit()结束,否则直到主进程函数退出才释放

2.3 等待线程结束

pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable(结合属性)属性。 函数原型

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

参数 第一个参数: 线程标识符,即线程ID,标识唯一线程。 最后一个参数: 用户定义的指针,用来存储被等待线程返回的地址。 返回值 0代表成功。 失败,返回的则是错误号。 接收线程返回值示例:

//退出线程pthread_exit ("线程已正常退出");//接收线程的返回值void *pth_join_ret1;pthread_join( thread1, &pth_join_ret1);

2.4 线程分离属性

创建一个线程默认的状态是joinable(结合属性),如果一个线程结束运行但没有调用pthread_join,则它的状态类似于进程中的Zombie Process(僵死进程),即还有一部分资源没有被回收(退出状态码),所以创建线程者应该pthread_join来等待线程运行结束,并可得到线程的退出代码,回收其资源(类似于进程的wait,waitpid)。但是调用pthread_join(pthread_id)函数后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。

pthread_detach函数可以将该线程的状态设置为detached(分离状态),则该线程运行结束后会自动释放所有资源。 函数原型

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

参数 线程标识符 返回值 0表示成功。错误返回错误码。 EINVAL线程并不是一个可接合线程。 ESRCH没有线程ID可以被发现。

2.5 获取当前线程的标识符

pthread_self函数功能是获得线程自身的ID。 函数原型

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

返回值 当前线程的标识符。 pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则显示结果出问题。

2.6 自动清理线程资源

线程可以安排它退出时需要调用的函数,这样的函数称为线程清理处理程序。用于程序异常退出的时候做一些善后的资源清理。 在POSIX线程api中提供了一个pthread_cleanup_push()/pthread_cleanup_pop()函数用于自动释放资源。从pthread_cleanup_push()的调用点到pthread_cleanup_pop()之间的程序段中的终止动作(包括调用 pthread_exit()和异常终止)都将执行pthread_cleanup_push()所指定的清理函数。

注意:pthread_cleanup_push函数与pthread_cleanup_pop函数需要成对调用。 函数原型

void pthread_cleanup_push(void (*routine)(void *),void *arg); //注册清理函数void pthread_cleanup_pop(int execute); //释放清理函数

参数 void (*routine)(void *) :处理程序的函数入口。 void *arg :传递给处理函数的形参。 int execute:执行的状态值。 0表示不调用清理函数。1表示调用清理函数。

导致清理函数调用的条件:

调用pthread_exit()函数

pthread_cleanup_pop的形参为1。 注意:return不会导致清理函数调用。

2.7 自动清理线程示例代码

#include <stdio.h>#include <pthread.h>#include <stdlib.h>//线程清理函数void routine_func(void *arg){   printf("线程资源清理成功\n");}//线程工作函数void *start_routine(void *dev){   pthread_cleanup_push(routine_func,NULL);   //终止线程   // pthread_exit(NULL);       pthread_cleanup_pop(1); //1会导致清理函数被调用。0不会调用。}int main(int argc,char *argv[]){   pthread_t thread_id;  //存放线程的标识符      if(pthread_create(&thread_id,NULL,start_routine,NULL)!=0)   {      printf("线程创建失败!\n");   }      if(pthread_detach(thread_id)!=0)   {   printf("分离属性设置失败!\n");   }   while(1){}   return 0;}

2.8 线程取消函数

pthread_cancel函数为线程取消函数,用来取消同一进程中的其他线程。

头文件: #include <pthread.h>函数原型:pthread_cancel(pthread_t tid);

“Linux pthread线程怎么创建与使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Linux pthread线程怎么创建与使用

本文链接: https://www.lsjlt.com/news/321861.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux pthread线程怎么创建与使用
    本篇内容介绍了“Linux pthread线程怎么创建与使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.前言线程与进程的区别 ...
    99+
    2023-06-29
  • linux中pthread怎么使用
    在Linux中,pthread是一种用于多线程编程的库。下面是使用pthread的一些基本步骤:1. 包含pthread.h头文件:...
    99+
    2023-09-13
    linux pthread
  • Linux多线程怎么创建
    在Linux中,可以使用pthread库来创建多线程。下面是一个简单的例子:```c#include #include // 线程函...
    99+
    2023-08-16
    Linux
  • ​linux中怎么创建多线程
    这篇文章主要介绍了linux中怎么创建多线程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux中怎么创建多线程文章都会有所收获,下面我们一起来看看吧。linux线程分为两...
    99+
    2024-04-02
  • Linux系统怎么创建线程
    这期内容当中小编将会给大家带来有关Linux系统怎么创建线程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。线程创建在传统Unix进程模型中,每个进程只有一个控制线程。在POSIX线程(pthread)的情...
    99+
    2023-06-28
  • Java中的异步与线程池怎么创建使用
    这篇文章主要介绍“Java中的异步与线程池怎么创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的异步与线程池怎么创建使用”文章能帮助大家解决问题。初始化线程的4种方式1.继承Thre...
    99+
    2023-07-04
  • 怎么在python中使用threading创建线程
    本篇文章为大家展示了怎么在python中使用threading创建线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究...
    99+
    2023-06-14
  • Python线程池thread pool怎么创建使用
    本文小编为大家详细介绍“Python线程池thread pool怎么创建使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python线程池thread pool怎么创建使用”文章能帮助大家解决疑惑,下面跟着小编的思路...
    99+
    2023-06-30
  • Java线程创建与Thread类的使用方法
    目录1.线程与Thread类1.1操作系统中的线程与Java线程1.1.1线程与Thread类1.1.2Thread类的构造方法1.1.3启用java线程必会的方法1.2第一个Jav...
    99+
    2024-04-02
  • c#怎么创建线程
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • python怎么创建线程
    Python中创建线程的方法有两种,一种是使用`threading`模块,另一种是继承`Thread`类。使用`threading`...
    99+
    2023-08-15
    python
  • Java中怎么使用Thread和Runnable创建线程
    这篇“Java中怎么使用Thread和Runnable创建线程”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中怎么使...
    99+
    2023-07-02
  • java怎么创建多线程
    在Java中,有两种方法可以创建多线程:1. 继承`Thread`类:创建一个类,继承自`Thread`类,并重写`run()`方法...
    99+
    2023-08-12
    java
  • Linux之线程的创建方式
    目录线程的概念与实现方式线程的实现方式linux系统实现多线程的方式线程和进程的区别多线程开发的三个基本概念线程库的使用线程库中的其他方法线程属性线程属性初始化线程分离总结线程的概念与实现方式 线程是进程内部的一条执行序...
    99+
    2023-03-23
    Linux线程的创建 Linux线程 Linux创建线程
  • linux线程的创建方法是什么
    在Linux系统中,可以使用pthread库来创建线程。pthread库是一个POSIX线程库,提供了一系列函数来创建、管理和同步线...
    99+
    2023-08-30
    linux
  • Linux线程的创建方式是什么
    这篇文章主要介绍“Linux线程的创建方式是什么”,在日常操作中,相信很多人在Linux线程的创建方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux线程的创建方式是什么”的疑惑有所帮助!接下来...
    99+
    2023-07-05
  • linux创建线程的函数是什么
    这篇文章主要介绍“linux创建线程的函数是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux创建线程的函数是什么”文章能帮助大家解决问题。linux有创建线程的函数,即“pthread_...
    99+
    2023-06-29
  • Linux系统如何创建线程
    这篇文章主要为大家展示了“Linux系统如何创建线程”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统如何创建线程”这篇文章吧。在创建多个控制线程以前,程序的行为与传统的进程并没有什么...
    99+
    2023-06-28
  • Python线程的创建与常用方法是什么
    这篇文章主要介绍“Python线程的创建与常用方法是什么”,在日常操作中,相信很多人在Python线程的创建与常用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python线程的创建与常用方法是什么...
    99+
    2023-06-30
  • 怎么在java中使用ThreadPoolExecutor创建一个线程池
    这篇文章给大家介绍怎么在java中使用ThreadPoolExecutor创建一个线程池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作