iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >如何实现Linux多线程编程
  • 676
分享到

如何实现Linux多线程编程

2023-06-13 00:06:34 676人浏览 薄情痞子
摘要

这篇文章主要介绍“如何实现linux多线程编程”,在日常操作中,相信很多人在如何实现Linux多线程编程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现Linux多线程编程”的疑惑有所帮助!接下来,请跟

这篇文章主要介绍“如何实现linux多线程编程”,在日常操作中,相信很多人在如何实现Linux多线程编程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现Linux多线程编程”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、多线程 VS 多进程

和进程相比,线程有很多优势。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护代码段和数据。而运行于一个进程中的多个线程,他们之间使用相同的地址空间。正是这样,同一进程下的线程之间共享数据空间,数据可以相互使用,并且线程间切换也要更快些,可以更有效的利用CPU。

二、程序设计

[注] 头文件<pthread.h> 编译时要加载动态库 libpthread.a,使用 -lpthread
 
1、创建线程
2、等待线程
3、关闭线程
4、退出清除
 
1、创建线程

代码如下:


        int pthread_create(pthread_t *tidp, const pthread_attr_t *attr, void *(*start_rtn)(void), void *arg)


tidp为线程id,是函数分配的值,所以要传一个 pthread_t 的地址。
attr线程属性,通常为空。
start_rtn为线程要执行的函数,返回值为空指针,参数为后面的*arg
若成功则返回0,否则返回出错编号。
 
例:

代码如下:


#include<stdio.h>
#include<pthread.h></p><p>void *func1(void *arg){        //原函数声明
       int i;
       for(i=0;i<5;i++){
               printf("this is func1! The num is %d\n",*(int*)arg);    //将空指针转换为int型指针
               sleep(1);
       }
}</p><p>void *func2(int *m){ //自定义类型声明,也可以定义非指针类型,但是在create时会有警告,因为非地址并不能改变传入的值
       int i;
       for(i=0;i<5;i++){
               printf("this is func2! The num is %d\n",*m);
               (*m)++;
               sleep(1);
       }
}</p><p>int main(){
       pthread_t id1,id2;
       int num = 5;
       int *p = &num;
       if(pthread_create(&id1,NULL,(void *)func1,(void *)p) != 0){
               printf("thread1 create error!\n");
               return -1;
       }
       if(pthread_create(&id2,NULL,(void *)func2,&num) != 0){
               printf("thread2 create error!\n");
               return -1;
       }
       pthread_join(id1,NULL);     //等待线程结束  
       pthread_join(id2,NULL);
       printf("Running complete!\n");
       return 0;</p><p>
}

运行结果:

代码如下:


[fsy@localhost process]$ GCc thC.c -o thC -lpthread -g
[fsy@localhost process]$ ./thC
this is func2! The num is 5
this is func1! The num is 6
this is func2! The num is 6
this is func1! The num is 7
this is func2! The num is 7
this is func1! The num is 8
this is func2! The num is 8
this is func1! The num is 9
this is func2! The num is 9
this is func1! The num is 10
Running complete!
[fsy@localhost process]$


2、等待线程

[注]当调用pthread_create函数时,线程并没有开始执行,主进程应有等待,比如用sleep,或者用更专业的函数:pthread_join

代码如下:


   int pthread_join(pthread_t tid, void **rval_ptr)


调用函数可以阻塞调用线程,直到指定的线程终止。
tid为等待退出线程的id,rval_ptr为函数的返回值。是指向指针的指针,可以置空。
 
例:

代码如下:


#include<stdio.h>
#include<pthread.h>
#include<stdlib.h></p><p>void *func(int *p){
       int *num=(int *)malloc(sizeof(int));     //必须动态创建,原因可以参考我动态分配内存的博客
       printf("Please input the number: ");
       scanf("%d",num);
       return (void *)num;              //类型是pthread_create的参数规定的
}</p><p>int main(){
       pthread_t pth;
       void *a;
       if(pthread_create(&pth,NULL,(void *)func,NULL) != 0){
               printf("create thread error!\n");
               return 1;
       }
       pthread_join(pth,&a);          //指向空指针的指针
       printf("get the num from the thread, it's %d\n",*(int *)a);
       return 0;
}

3、终止线程

线程终止有以下三种方式:

线程从函数中返回
2、线程可以别其他函数终止
3、线程自己调用pthread_exit函数

代码如下:


void pthread_exit(void *rval_ptr)


rval_ptr为线程退出返回值的指针,即函数返回值。

4、退出清除

代码如下:


      void pthread_cleanup_push(void (*rtn)(void*), void *arg)


rtn为清除函数,arg是清除函数的参数

代码如下:


void pthread_cleanup_pop(int execute)


当execute 非0时执行清除函数。为0时不执行。

从pthread_cleanup_push的调用点到pthread_cleanup_pop之间的程序段中,如果有终止进程的动作,如调用pthread_exit或异常终止(不包括return),就会执行pthread_cleanup_push()所指定的清理函数。多个嵌套匹配时,就近匹配。
 
例:

代码如下:


#include<stdio.h>
#include<pthread.h></p><p>void *clean(char *argv){
       printf("clean is called by %s\n",argv);
       return NULL;
}
void *func1(void *argv){
       printf("welcome enter the func1!\n");
       pthread_cleanup_push((void*)clean,"the first time call!");
       pthread_cleanup_push((void*)clean,"the second time call!");
       if(argv){
               return (void *)1;            //第二次运行将此句注掉
       }
       pthread_cleanup_pop(0);
       pthread_cleanup_pop(1);
       return (void *)0;
}</p><p>void *func2(void *argv){
       sleep(1);             //两个线程运行先后不确定
       printf("welcome enter the func2!\n");
       pthread_cleanup_push((void*)clean,"the first time call!");
       pthread_cleanup_push((void*)clean,"the second time call!");
       if(argv){
               pthread_exit(NULL);
       }
       pthread_cleanup_pop(0);
       pthread_cleanup_pop(0);
       return (void *)0;
}</p><p>
int main(){
       pthread_t tid1,tid2;
       if(pthread_create(&tid1,NULL,(void *)func1,(void *)1) != 0){
               printf("thread1 create error!\n");
               return 1;
       }</p><p>         if(pthread_create(&tid2,NULL,(void *)func2,(void *)1) != 0){
               printf("thread2 create error!\n");
               return 1;
       }
       pthread_join(tid1,NULL);
       pthread_join(tid2,NULL);
       return 0;
}

运行结果:

代码如下:


[fsy@localhost process]$ gcc thClean.c -o thclean -lpthread
[fsy@localhost process]$ ./thclean
welcome enter the func1!
welcome enter the func2!
clean is called by the second time call!          //此处先2后1
clean is called by the first time call!
[fsy@localhost process]$ vim thClean.c
[fsy@localhost process]$ gcc thClean.c -o thclean -lpthread
[fsy@localhost process]$ ./thclean
welcome enter the func1!
clean is called by the first time call!          //second已经被pop
welcome enter the func2!
clean is called by the second time call!
clean is called by the first time call!
[fsy@localhost process]$

到此,关于“如何实现Linux多线程编程”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何实现Linux多线程编程

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

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

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

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

下载Word文档
猜你喜欢
  • 如何实现Linux多线程编程
    这篇文章主要介绍“如何实现Linux多线程编程”,在日常操作中,相信很多人在如何实现Linux多线程编程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何实现Linux多线程编程”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-13
  • 如何用PHP实现多线程编程
    目录多线程线程适用场景PHP中的多线程线程安全PHP 实现类和方法实例代码异步请求超时控制总结多线程 线程 首先说下线程: 线程(thread) 是操作系统能够进行运算调度的最小单位...
    99+
    2024-04-02
  • VB.NET如何实现多线程编程技术
    这篇文章将为大家详细讲解有关VB.NET如何实现多线程编程技术,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。传统的VB.NET多线程编程开发人员已经建立了同步应用程序,在这些程序中事务按顺序执行。尽管由于...
    99+
    2023-06-17
  • Linux下怎么实现shell多线程编程
    本篇内容介绍了“Linux下怎么实现shell多线程编程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  Linux中多线程编程拥有提高应用...
    99+
    2023-06-13
  • Linux多线程编程实例分析
    这篇文章主要讲解了“Linux多线程编程实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux多线程编程实例分析”吧!线程  线程是计算机中独立运...
    99+
    2024-04-02
  • 如何解析Linux系统多线程编程
    这篇文章的内容主要围绕如何解析Linux系统多线程编程进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!Linux下的多线程编程1 引言  线程(thr...
    99+
    2023-06-28
  • Qt5多线程编程的实现
    目录一、线程基础1、GUI线程与工作线程2、数据的同步访问二、QT多线程简介三、QThread线程四、简单实例一、线程基础 1、GUI线程与工作线程 每个程序启动后拥有的第一个线程称...
    99+
    2024-04-02
  • 如何使用 C++ 函数实现多线程编程?
    如何使用 c++++ 函数实现多线程编程?创建一个带有可调用对象的 std::thread 对象。调用 join() 函数等待线程完成。使用互斥量、条件变量和信号量等线程同步技术来确保共...
    99+
    2024-04-26
    c++ 多线程编程 并发访问
  • C#怎么实现多线程编程
    本文小编为大家详细介绍“C#怎么实现多线程编程”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现多线程编程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、使用线程的理由可以使用线程将代码同其他代码隔离...
    99+
    2023-06-30
  • Java如何实现多线程、线程同步
    这篇文章主要介绍了Java如何实现多线程、线程同步的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java如何实现多线程、线程同步文章都会有所收获,下面我们一起来看看吧。1 多线程1.1 进程进程:是正在运行的程...
    99+
    2023-06-30
  • 怎么在linux系统中实现openmp多线程编程
    本篇文章给大家分享的是有关怎么在linux系统中实现openmp多线程编程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。关键语法:代码如下:#inlcude <omp.h...
    99+
    2023-06-13
  • PHP 多线程如何实现?
    php 多线程是指在一个进程中同时运行多个任务,通过创建独立运行的线程实现。php 中可以使用 pthreads 扩展模拟多线程行为,安装后可使用 thread 类创建和启动线程。例如,...
    99+
    2024-05-06
    php 多线程
  • 什么是linux多线程编程
    本篇内容介绍了“什么是linux多线程编程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程分类线程按照其调度者可以分为用户级线程和核心级线...
    99+
    2023-06-09
  • Java中怎样实现多线程编程
    今天就跟大家聊聊有关Java中怎样实现多线程编程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、理解Java多线程编程Java多线程编程是这样一种机制,它允许在程序中并发执行多个指...
    99+
    2023-06-17
  • 多线程并发编程如何在Java项目中实现
    本篇文章为大家展示了多线程并发编程如何在Java项目中实现 ,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、多线程操作系统有两个容易混淆的概念,进程和线程。进程:一个计算机程序的运行实例,包含了需...
    99+
    2023-05-31
    java 多线程 并发编程
  • C++ 如何实现多线程与线程同步
    目录CreateThread 实现多线程:beginthreadex 实现多线程:CreateMutex 互斥锁实现线程同步:通过临界区实现线程同步:Semaphore 基于信号实现...
    99+
    2024-04-02
  • 《PHP并发编程基础教程:如何使用容器实现多线程编程?》
    PHP并发编程基础教程:如何使用容器实现多线程编程? PHP是一种广泛使用的服务器端编程语言,但是它在并发编程方面的表现并不理想。不过,使用容器技术,我们可以在PHP中实现多线程编程,从而提高程序的并发处理能力。本文将介绍如何使用容器技术来...
    99+
    2023-10-02
    并发 教程 容器
  • Python多线程编程实例
    Python多线程编程 发布者:lanyulei,转载请注明出处:http://www.fdevops.com/p=517 下面多线程模块threading的方法注释,均来自于百度贴吧"学点编程吧"。 Thread: 表示一个线程的执行对象...
    99+
    2023-01-31
    多线程 实例 Python
  • java多线程编程实例
    以下是一个简单的Java多线程编程实例:```javapublic class MultiThreadExample impleme...
    99+
    2023-08-16
    Java
  • 如何编写C#多线程
    这篇文章主要为大家展示了“如何编写C#多线程”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何编写C#多线程”这篇文章吧。编写C#多线程应用程序非常得容易,即使对于那些从没有编写C#多线程应用程...
    99+
    2023-06-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作