Linux 应用基础 多线程编程


前言

什么是 多线程编程 呢?
大家写代码时可能遇到过一个问题,想实现两个事件,一个需要等待,另一个需要实时进行,这时候如果想两者都正常运行,就需要使用多线程编程了。


一、多线程编程概念

1 .实例:

如果一个程序,你想实现按一下按键 就播放一首歌。可是呢?又担心按键程序会有延迟,不能及时的播放音乐。 这时,如果使用多进程编程,相当于出现了两个 main 函数,在这两个 main 函数之前要进行联络就需要使用相应的函数,就会造成很长时间的浪费。 如果,使用多线程编程,就会使两个功能在一个程序中,通过一个全局变量就可以实现联络,节省时间。

2.多线程概述:

所谓线程,就是操作系统所能调度的最小单位。对于普通的进程,只有一个线程在执行对应的逻辑。我们可以通过多线程编程,使一个进程可以去执行多个不同的任务。

相比多进程编程而言,线程享有共享资源,即在进程中出现的全局变量,每个线程都可以去访问它,,使得系统资源消耗减少,可以提高 CPU 的使用率。

二、线程的使用

1. 线程的标识: pthread_t :

对于一个进程都有对应的一个 PID 号,而对于线程有着一个类似的PID号, 是 tid (线程号)。可以通过函数 pthread_self来返回当前线程的线程号

	#include <pthread.h>
	
	pthread_t tid = pthread_self();//获取主线程的tid号
2.查看线程数 , 进程号:

(1). 在 ps 命令中,“-T” 选项可以开启进程查看。

[root@100ask:/mnt]#
[root@100ask:/mnt]# ps - T
PID   USER     COMMAND

(2). 通过 cat /proc/进程号/status | grep Threads 查看线程号。
Threads 后面的是线程数。

[root@100ask:/mnt]#
[root@100ask:/mnt]# cat /proc/390/status | grep Threads
Threads:        3
[root@100ask:/mnt]#

3. 创建线程:
pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

pthread :指针,用来保存新建线程的线程号 ( tid ).
第二个参数表示了线程的属性,一般传入NULL表示默认属性.
第三个参数是一个函数指针,就是线程执行的函数.

	void *fun(void *arg)
	{
 		printf("pthread_New = %lu\n",(unsigned long)pthread_self());//打印线程的tid号
 	}

	int main()
	{

		pthread_t tid1;
		pthread_create(&tid1,NULL,fun,NULL);//创建线程
		
	}

三. 互斥量

当多个线程 A , B 都想访问一块空间时,为保证这块空间数据的可靠性,不被随意改变,就要使用一把锁将其空间锁住。 A 要访问时,就锁住,则 B 就不可随意改变其数值。等到 A 结束后,再将其打开,B就可以访问。反之,一样。 这就是需要用到 互斥量。

1. 互斥量的初始化:
pthread_mutex_t g_tMutex  = PTHREAD_MUTEX_INITIALIZER;

2. 互斥量加锁/解锁:
 
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

成功:返回0

四. 条件变量

条件变量时一种同步机制,用来通知其他线程条件满足了。一般是用来通知对方共享数据的状态信息,因此条件变量时结合互斥量来使用的。

1. 条件变量的初始化:
pthread_cond_t  g_tConVar = PTHREAD_COND_INITIALIZER;

2. 休眠等待 (等待条件变量):
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
3. 通知条件变量:
int pthread_cond_signal(pthread_cond_t *cond);

总结

多线程编程在实际工作会用很多,希望大家好好理解一下。不清楚的欢迎留言讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果罐子♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值