多线程(6)多线程同步之临界区(Linux实现)
1. 什么是临界资源,临界区?
-
临界资源
多线程之间可能需要互斥的访问一些全局变量,这就需要互斥的来访问,这些需要共享访问的字段被称作是 临界资源临界资源:只能被一个进程同时使用(不可以多个进程共享),要用到互斥
-
临界区
临界区:不是个简单的区域!是加锁区间的代码!
2.临界区的特点
- 临界区在任意时刻只允许一个线程对共享资源进行访问。
- 如果有多个线程试图同时访问临界区,那么有线程进入后,其他线程试图访问时将被挂起,直到进入临界区的线程离开。
3. 接口(Linux实现)
- linux 没有临界区对应的接口,
而是通过pthread_mutex_t 接口来模拟临界区的功能。
实现线程间的互斥与同步机制的是锁机制,下面是常用的锁机制的函数和类。
pthread_mutex_t mutex //锁对象
pthread_mutex_init(&mutex,NULL) //在主线程中初始化锁为解锁状态
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER //编译时初始化锁为解锁状态
pthread_mutex_lock(&mutex) //(阻塞加锁)访问临界区加锁操作
pthread_mutex_trylock( &mutex) //(非阻塞加锁),与lock类似,
不同的是在锁已经被占据时返回 EBUSY 而不是挂起等待。
pthread_mutex_unlock(&mutex) //访问临界区解锁操作
4. 例子-linux
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int iShareData = 0;
// add mutex
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void thread_Increse_Num(void)
{
long i,tmp;
for(i =0;i<=10000;++i)
{
// lock
if(pthread_mutex_lock(&mutex) != 0)
{
perror("pthread_mutex_lock");
exit(EXIT_FAILURE);
}
tmp = iShareData;
tmp = tmp + 1;
iShareData = tmp;
// unlock
if(pthread_mutex_unlock(&mutex) != 0)
{
perror("pthread_mutex_unlock");
exit(EXIT_FAILURE);
}
}
}
int main()
{
int ret;
pthread_t thread1,thread2,thread3;
ret = pthread_create(&thread1,NULL,(void *)&thread_Increse_Num,NULL);
ret = pthread_create(&thread2,NULL,(void *)&thread_Increse_Num,NULL);
ret = pthread_create(&thread3,NULL,(void *)&thread_Increse_Num,NULL);
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
pthread_join(thread3,NULL);
printf("iShareData = %d\n",iShareData);
return 0;
}
参考
1. https://blog.csdn.net/qq_41248872/article/details/82991949