Linux 应用基础 多线程编程

举报
糖果罐子 发表于 2023/07/21 20:01:40 2023/07/21
【摘要】 @TOC 前言什么是 多线程编程 呢?大家写代码时可能遇到过一个问题,想实现两个事件,一个需要等待,另一个需要实时进行,这时候如果想两者都正常运行,就需要使用多线程编程了。 一、多线程编程概念 1 .实例:如果一个程序,你想实现按一下按键 就播放一首歌。可是呢?又担心按键程序会有延迟,不能及时的播放音乐。 这时,如果使用多进程编程,相当于出现了两个 main 函数,在这两个 main ...

@TOC


前言

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


一、多线程编程概念

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);

总结

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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。