首页 > 系统相关 >Linux应用编程_多线程编程

Linux应用编程_多线程编程

时间:2023-09-05 23:00:12浏览次数:41  
标签:线程 Linux int 编程 cond pthread mutex sem 多线程

(1)线程的创建:
	pthread_t tid = pthread_self();						//获取当前线程的tid号
	int ret = pthread_create(&tid1,NULL,fun1,(void *)&a);//创建线程传入变量a的地址
	ret = pthread_create(&tid2,NULL,fun2,(void *)(long)a);//创建线程传入变量a的值
(2)线程的退出与回收:
	pthread_exit((void *)&tmp);						//线程主动退出,将变量tmp取地址转化为void*类型传出
	pthread_cancel((pthread_t )(long)arg);			//杀死线程,使之强制退出
	pthread_join(tid1,&Tmp);						//线程资源回收(阻塞方式)
	if(pthread_tryjoin_np(tid[i],&Tmp) == 0)		//线程资源回收(非阻塞方式)
(3)线程的控制:
	1)互斥量: 临界资源访问
		ret = pthread_mutex_init(&mutex,NULL);//初始化互斥量
		pthread_mutex_lock(&mutex);//加锁 若有线程获得锁,则会阻塞
		pthread_mutex_unlock(&mutex);//解锁
		int pthread_mutex_trylock(pthread_mutex_t *mutex);	//互斥量加锁(非阻塞)
		pthread_mutex_destroy(&mutex);//销毁互斥量
	2)信号量: 线程执行顺序
		int sem_init(sem_t *sem,int pshared,unsigned int value);	//第二个参数传入0代表线程控制,否则为进程控制;
		int sem_wait(sem_t *sem);		//(阻塞)检测指定信号量是否有资源可用,执行“sem-1”的操作
		int sem_post(sem_t *sem);		//(阻塞)释放指定信号量的资源,执行“sem+1”操作
		int sem_trywait(sem_t *sem);	//信号量申请资源(非阻塞),功能与sem_wait一致
		int sem_destory(sem_t *sem);	//信号量销毁
		
		示例:
			ret = sem_init(&sem1,0,1);  //初始化信号量1 并且赋予其资源
			ret = sem_init(&sem2,0,0); //初始化信号量2 让其阻塞
			ret = sem_init(&sem3,0,0); //初始化信号3 让其阻塞
			sem_wait(&sem1);//因sem1本身有资源,所以不被阻塞 获取后sem1-1 下次会会阻塞
			sem_post(&sem2);// 使得sem2获取到资源
			sem_wait(&sem2);//因sem2在初始化时无资源会被阻塞,直至14行代码执行 不被阻塞 sem2-1 下次会阻塞
			sem_post(&sem3);// 使得sem3获取到资源
			sem_wait(&sem3);//因sem3在初始化时无资源会被阻塞,直至22行代码执行 不被阻塞 sem3-1 下次会阻塞
			sem_post(&sem1);// 使得sem1获取到资源
			sem_destroy(&sem1);			//销毁信号量
			sem_destroy(&sem2);
			sem_destroy(&sem3);
	3)条件变量:一种同步机制,一般是用来通知对方共享数据的状态信息,因此条件变量是结合互斥量来使用的
		pthread_cond_t cond = PTHREAD_COND_INITIALIZER;	// 初始化条件变量
		int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);//// 初始化条件变量, cond_attr通常为NULL
		int pthread_cond_destroy(pthread_cond_t *cond);	// 销毁条件变量
		int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);	//等待条件变量,需要结合互斥量一起使用
		int pthread_cond_signal(pthread_cond_t *cond);	//通知条件变量
		
		示例:
			static pthread_mutex_t g_tMutex  = PTHREAD_MUTEX_INITIALIZER;
			static pthread_cond_t  g_tConVar = PTHREAD_COND_INITIALIZER;
			pthread_mutex_lock(&g_tMutex);					
			pthread_cond_wait(&g_tConVar, &g_tMutex);	// 如果条件不满足则,会 unlock g_tMutex ;条件满足后被唤醒,会 lock g_tMutex
			pthread_mutex_unlock(&g_tMutex);

			pthread_mutex_lock(&g_tMutex);
			pthread_cond_signal(&g_tConVar); /* 通知接收线程 */
			pthread_mutex_unlock(&g_tMutex);
			

参考:韦东山Linux教程

标签:线程,Linux,int,编程,cond,pthread,mutex,sem,多线程
From: https://www.cnblogs.com/charlie12345/p/17681112.html

相关文章

  • Linux应用编程_网络通信TCP/UDP
    (1)网络协议被分为5层 1)应用层:直接为用户的应用进程提供服务 HTTP协议,FTP协议,DNS,POP3,SNMP,Telnet 2)运输层(传输层):负责向两个主机中进程之间的通信提供服务 (基于TCP/UDP) (1)传输控制协议TCP(TransmissionControlProtocol): 1)数据传输的单位是报文段 2)面向......
  • Linux 命令总结
    Linux文件系统FHS3.0(FilesystemHierarchyStandard)/etc配置文件bin必要命令usr二级目录home家目录var动态数据VFS虚拟文件系统内核层抽象出通用的文件系统接口支持文件、网络、特殊文件系统抽象对象:超级快:文件系统目录项:文件路径索引节点:具体文件文件:进程打开的文件属性分层......
  • 《C++并发编程实战》读书笔记(4):原子变量
    1、标准原子类型标准原子类型的定义位于头文件<atomic>内。原子操作的关键用途是取代需要互斥的同步方式,但假设原子操作本身也在内部使用了互斥,就很可能无法达到期望的性能提升。有三种方法来判断一个原子类型是否属于无锁数据结构:所有标准原子类型(std::atomic_flag除外,因为它......
  • Linux运维工程师面试题(7)
    Linux运维工程师面试题(7)祝各位小伙伴们早日找到自己心仪的工作。持续学习才不会被淘汰。地球不爆炸,我们不放假。机会总是留给有有准备的人的。加油,打工人!1常用的ansible模块有哪些PingCommandShellScriptCopyFetchFileYumServiceUserGroupLineinfileRepla......
  • Linux运维工程师面试题(7)
    目录Linux运维工程师面试题(7)1常用的ansible模块有哪些2说一下ansible使用roles编排的目录结构3docker六大命名空间namespace4cgroups的作用5runc的作用6docker常用的命令7docker存储引擎有哪些,区别是什么8进入docker容器有几种方法,区别是什么9Dockerfile......
  • linux系统调优
    1.禁用swap分区swapoff-a&&sysctl-wvm.swappiness=0sed-ri'/^[^#]*swap/s@^@#@'/etc/fstabgrepswap/etc/fstab2. 禁用防火墙和selinux2.1禁用防火墙,网络管理,邮箱systemctldisable --nowfirewalldNetworkManagerpostfix 2.2禁用selinux2.2.1命令行直......
  • 《Java编程思想第四版》学习笔记23
    在Inning中,可以看到无论构建器还是event()方法都指出自己会“掷”出一个违例,但它们实际上没有那样做。这是合法的,因为它允许我们强迫用户捕获可能在覆盖过的event()版本里添加的任何违例。同样的道理也适用于abstract方法,就象在atBat()里展示的那样。“interfaceStorm”非......
  • linux日志文件的查询方式
    cdlog到指定log日志文件目录ls查看当前文件存在的目录catjujube.log可以查看较小的日志文件vijujube.log查看较大的日志文件(常用)/(查询的字符)可以定位到这个字符的位置N继续向下检索:$回到日志文件的最底层可以用于从底层开始查找使用:$后配合使......
  • Linux中有哪些常用的网络命令,分别适用于什么场景?
    Linux作为一种广泛使用的操作系统,其网络功能非常强大。在Linux系统中,有很多网络相关的命令可以用于管理和配置网络,比如ifconfig、netstat、ping、traceroute、route等等。本文将对一些常用的Linux网络命令进行详细介绍。一、ifconfig命令ifconfig命令用于显示和配置Linux系统的网......
  • 前端编程题(一):数组
    手写数组常见方法//数组mapArray.prototype.myMap=function(callback){constarr=[]for(leti=0;i<this.length;i++){arr[i]=callback(this[i],i);}returnarr;}//数组filterArray.prototype.myFilter=function(callback){const......