文章目录
前言
什么是 多线程编程 呢?
大家写代码时可能遇到过一个问题,想实现两个事件,一个需要等待,另一个需要实时进行,这时候如果想两者都正常运行,就需要使用多线程编程了。
一、多线程编程概念
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);
总结
多线程编程在实际工作会用很多,希望大家好好理解一下。不清楚的欢迎留言讨论。