首页 > 系统相关 >Linux的多线程

Linux的多线程

时间:2022-11-22 23:10:06浏览次数:67  
标签:函数 Linux 线程 pthread 进程 exit 多线程 routine


 

线程的概念

和多进程相比,多线程是一种比较节省资源的多任务操作方式。启动一个新的进程必须分配给它独立的​​地址空间​​​,每个进程都有自己的​​堆栈段​​​和​​数据段​​​,系统开销比较高,进行数据的传递只能通过进行间通信的方式进行。在同一个进程中,可以运行多个线程,运行于同一个进程中的多个线程,它们彼此之间使用相同的​​地址空间​​,共享全局数据,启动一个线程所消耗的资源比启动一个进程所消耗的资源要少。

线程的使用

1、创建线程

在Linux下,采用pthread_create函数来创建一个新的线程,函数声明:

包含头文件:

#include <pthread.h>

函数声明:

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

参数thread为为指向线程​​标识符​​的地址。

参数attr用于设置线程属性,一般为空,表示使用默认属性。

参数start_routine是线程运行函数的地址。

参数arg是线程运行函数的参数。新创建的线程从start_routine函数的地址开始运行,该函数只有一个无类型指针参数arg。

在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库。

2、线程的终止

如果进程中的任一线程调用了exit,则整个进程会终止,所以,在线程的start_routine函数中,不能采用exit。

线程的终止有三种方式:

线程的start_routine函数代码结束,自然消亡。

线程的start_routine函数调用pthread_exit结束,不想活了。

被主进程或其它线程中止,被杀了,一般情况不会这么做。

pthread_exit函数的声明如下:

void pthread_exit(void *retval);

参数retval填空。

3、线程示例

我们把TCP通信的服务端(book249.cpp)程序改一下,由多进程改为多线程。

       线程主函数的声明:

       

Linux的多线程_C++语言

       线程主函数的定义:

       

Linux的多线程_C++语言_02

       主程序的main函数book261.cpp

       

Linux的多线程_C++语言_03

       需要注意一个问题:

       1)线程可以共享全局变量,当然也可以共享TcpServer的m_clientfd成员变量,但是,创建线程的时候,为什么要把客户端的socket用参数传给线程主函数,而不是直接获取TcpServer.m_clientfd的值,因为主进程调用pthread_create创建线程后,立即返回循环重新Accept,创建线程需要时间,如果在这段时间内有新的客户端连接上来,TcpServer.m_clientfd的值会发生改变。

       2)线程主函数的函数体中,不能使用return语句,如果想退出线程,可以用pthread_exit(0);返回。

应用经验

       Linux没有真正意义上的线程,它的实现是由进程来模拟,属于用户级线程。所以,在Linux系统下,进程与线程在性能和资源消耗方面没有本质的差别。对我们程序员来说,进程不能共享全局数据,线程可以共享全局数据,各位可以根据应用场景选择采用多进程或多线程。

 

版权声明

作者:码农有道

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

 

标签:函数,Linux,线程,pthread,进程,exit,多线程,routine
From: https://blog.51cto.com/u_13748800/5878686

相关文章

  • Linux线程同步介绍和示例
     线程同步的概念    线程同步?怎么同步?一起运行?一起停止?我当年听说线程同步这个词的时候,也是一头雾水。    在人们的日常生活中,所说的锁大概有两种:一种是不允......
  • Linux进程间通信的方法和示例
     进程通信的概念    进程数据空间是相互独立的,不能相互访问的。但某些情况下进程之间需要互相通信,来完成系统的某项功能或交换数据。进程通信的场景    1)......
  • Linux信号signal的介绍和示例
     如何让程序在后台运行    在之前的章节中,如果要运行程序,在命令提示行下输入程序名后回车,程序被执行,然后等待程序运行完成。在程序运行的过程中,可以用Ctrl+c中止它......
  • linux多进程介绍和示例
     进程的概念什么是进程?进程这个概念是针对系统而不是针对程序员的,对程序员来说,我们面对的概念是程序。当程序员敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。进......
  • linux文本工具
    目录一、文本工具 1一、文本编辑工具Vim 1二、文本文件查看命令cat 3三、more命令描述:more命令从前向后分页显示文件内容。 4四、Less命令描述 4五、head命令描述 5六、s......
  • Linux 4.6分支已到生命尽头 请尽快升级至Linux 4.7.1
    在Linux Kernel4.7首个维护版本发布的同时,GregKroah-Hartman同时也向社区发布了LinuxKernel4.6.7版本。作为Linux4.6分支的第7个维护版本,该分支也已经到了生命的......
  • Linux 系统自动化部署系统
    linux安装光盘中的相关文件:[root@Centos8cdrom]#lsBaseOSEFIimagesisolinuxLICENSEmedia.repoMinimalTRANS.TBL#isolinux:存放和安装相关的文件[root@......
  • Java多线程 线程池的生命周期及运行状态
    (目录)一、说明线程池的生命周期线程池的状态runState和工作线程数量workerCount共同保存在AtomicInteger类型的控制变量ctl中ctl高三位保存运行状态(2^3^=8>5),低2......
  • Linux操作系统学习(运维必会)
    1、开机登录开机会启动很多进程,在Windows上叫“服务”(service),在Linux上叫做“守护进程”(daemon)登录方式:命令行登录ssh登录图形界面登录2、关机不管是重启系统还是......
  • Linux创建进程为什么要用fork做为关键字
    众所周知,Linux创建进程程的时候要调用系统调用fork,fork翻译成中文为“分叉"的意思,真的理解创建进程的过程会发现,fork是很形象的。先看一段Linux创建进程的代码1intma......