IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux多线程学习 -> 正文阅读

[系统运维]linux多线程学习

学习笔记—1

1、多线程

多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
在操作系统原理的术语中,线程是进程的一条执行路径。线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,所有的线程都是在同一进程空间运行,这也意味着多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同- -进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。一个进程可以有很多线程,每条线程并行执行不同的任务。

2、创建线程

  1. 一个进程创建后,会首先生成一一个缺省的线程,通常称这个线程为主线程(或称控制线程),C/C++程序中,主线程就是通过main函数进入的线程,由主线程调用pthread_ create()创建的线程称为子线程,子线程也可以有自己的入口函数,该函数由用户在创建的时候指定。每个线程都有自己的线程ID,可以通过pthread self()函数获取。 最常见的线程模型中,除主线程较为特殊之外,其他线程一-旦被创建,相互之间就是对等关系,不存在隐含的层次关系。每个进程可创建的最大线程数由具体实现决定。
  2. 无论在windows中还是Posix中,主线程和子线程的默认关系是:无论子线程执行完毕与否, 一旦主线程执行完毕退出,所有子线程执行都会终止。这时整个进程结束或僵死,部分线程保持一种终止执行但还未销毁的状态,而进程必须在其所有线程销毁后销毁,这时进程处于僵死状态。线程函数执行完毕退出,或以其他非常方式终止,线程进入终止态,但是为线程分配的系统资源不一定释放,可能在系统重启之前,- -直都不能释放,终止态的线程,仍旧作为一个线程实体存在于操作系统中,什么时候销毁,取决于线程属性。在这种情况下,主线程和子线程通常定义以下两种关系:
  • 可会合(joinable) :这种关系下,主线程需要明确执行等待操作,在子线程结束后,主线程的等待操作执行完毕,子线程和主线程会合,这时主线程继续执行等待操作之后的下一步操作。主线程必须会合可会合的子线程。在主线程的线程函数内部调用子线程对象的wait函数实现,即使子线程能够在主线程之前执行完毕,进入终止态,也必须执行会合操作,否则,系统永远不会主动销毁线程,分配给该线程的系统资源也永远不会释放。
  • 相分离(detached) :表示子线程无需和主线程会合,也就是相分离的,这种情况下,子线程一旦进入终止状态,这种方式常用在线程数较多的情况下,有时让主线程逐个等待子线程结束,或者让主线程安排每个子线程结束的等待顺序,是很困难或不可能的,所以在并发子线程较多的情况下,这种方式也会经常使用。
#include<pthread>

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

说明: pthreand_ create()用来创建一个线程, 并执行第三个参数start_ routine所指向的函数
●第三个参数start_ routine是一个函数指针, 它指向的函数原型是void *func(void *),这是所创要执行的任务(函数) ;
●第四个参数arg就是传给了所调用的函数的参数,如果有多个参数需要传递给子线程则需要封构体里传进去;
●第一个参数thread是一个pthread
t类型的指针,他用来返回该线程的线程ID。每个线程都能包pthread_ self()来获取自 己的线程ID (pthread_ t类型)。
●第二个参数是线程的属性,类型是pthread_ attr_ t类型,期义如下:

typedef struct{
int						detachstate;//线程的分离状
int 					schedpolicy;//线程调度策略
struct sched_param		schedparam;//线程的调度参数
int						inheritsched;//线程的继承性
int						scope ;//线程的作用域
size_t    				guardsize; //线程栈末尾的警戒缓冲区大小
int         		   	stackaddr_set; //线程的栈设置
void*         		 	stackaddr; //线程栈的位置(最低地址)
size_t        	  		stacksize; //线程栈的大小
} pthread_attr_t; 


线程的分离状态决定一个线程以什么样的方式来终止自己,在默认的情况下,线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束,只有当pthread_ join函数返回时,创建的线程才算终止,释放自己占用的系统资源,而分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。

2、代码

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>

void *thread_worker1(void *args);
void *thread_worker2(void *args);

int main(int argc,char **argv)
{
	int		 	share_var=1000;
	pthread_t		tid;		//线程id
	pthread_attr_t		thread_attr;//线程属性
    /*初始化线程*/
	if(pthread_attr_init(&thread_attr))
	{
		printf("pthread_attr_init():%s\n",strerror(errno));
		return -1;
	}
	/*设置栈大小*/
	if(pthread_attr_setstacksize(&thread_attr,120*1024))
	{
		printf("pthread_attr_setstacksize() failure:%s\n",strerror(errno));
		return -1;
	}
		/*设置分离状态:分离*/
	if(pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED))
	{
		printf("pthread_attr_setdetachstate() failure:%s\n",strerror(errno));
		return -1;

	}
	/*创建线程*/
	pthread_create(&tid,&thread_attr,thread_worker1,&share_var);//id,属性,函数,传给函数的参数
	printf("Thread worker1 tid[%ld] crerate ok\n",tid);

	pthread_create(&tid,NULL,thread_worker2,&share_var);
	printf("Thread worker2 tid[%ld] crerate ok\n",tid);

	/*摧毁*/
	pthread_attr_destroy(&thread_attr);

	/*等待直到线程退出*/
	pthread_join(tid,NULL);

	while(1)
	{

		printf("main/control thread share_var:%d\n",share_var);
		sleep(10);

	}


}


void *thread_worker1( void *args)
{
	int 		*ptr=(int*)args;

	if(!args)
	{
		printf("%s() get invalid arguments\n",__FUNCTION__);
		pthread_exit(NULL);
	}
	printf("Thread worker 1 [%ld] start runing ...\n",pthread_self());
	while(1)
	{
		printf("+++:%s before shared_var++:%d\n",__FUNCTION__,*ptr);
		*ptr+=1;
		sleep(2);

		printf("+++:%s after sleep shared_var++:%d\n",__FUNCTION__,*ptr);
		*ptr+=1;
	
	}

	printf("Thread work 1 exit..\n");

	return NULL;

}
void *thread_worker2( void *args)
{
	int 		*ptr=(int*)args;

	if(!args)
	{
		printf("%s() get invalid arguments\n",__FUNCTION__);
		pthread_exit(NULL);
	}
	printf("Thread worker 2 [%ld] start runing ...\n",pthread_self());
	while(1)
	{
		printf("---:%s before shared_var++:%d\n",__FUNCTION__,*ptr);
		*ptr+=1;
		sleep(2);

		printf("---:%s after sleep shared_var++:%d\n",__FUNCTION__,*ptr);
		*ptr+=1;
	
	}

	printf("Thread work 2 exit..\n");

	return NULL;
}

现在我们编译运行一下程序看看效果, 注意对于多线程编程在编译时,-定要加上-lpthread选项告诉链接器在链接的时候要连接pthread库:

yangyong@ubuntu:~/Desktop$ ./a.out
Thread worker1 tid[139882953959168] crerate ok
Thread worker2 tid[139882953832192] crerate ok
Thread worker 2 [139882953832192] start runing ...
---:thread_worker2 before shared_var++:666
Thread worker 1 [139882953959168] start runing ...
+++:thread_worker1 before shared_var++:667
+++:thread_worker1 after sleep shared_var++:668
+++:thread_worker1 before shared_var++:669
---:thread_worker2 after sleep shared_var++:668
---:thread_worker2 before shared_var++:671
---:thread_worker2 after sleep shared_var++:672
---:thread_worker2 before shared_var++:673
+++:thread_worker1 after sleep shared_var++:674
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-05-13 12:00:08  更:2022-05-13 12:00:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:49:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码