多线程编程 之 互斥和同步;
互斥 ===》互斥锁 ===》pthread_mutex_t
使用操作框架:
创建互斥锁 ===》初始化互斥锁 ====》加锁、解锁 ===》销毁互斥锁;
1、创建互斥锁:使用互斥锁类型定义一个全局变量;
pthread_mutex_t mutex;
2、初始化互斥锁:pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
功能:该函数用于互斥锁的默认初始化,将锁的默认属性生效;
参数:mutex 要初始化的目标互斥锁#
atrr 要初始化的互斥锁属性值,一般NULL表示默认属性;
返回值:成功 0
失败 -1;
注意:一般在线程创建之前就要初始化互斥锁;
3、加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:该函数可以将某个区域的代码执行加锁操作
保证该部分代码的排他性访问;
参数: mutex 要加锁的互斥锁
返回值:0 成功 进程将会执行该行代码以后的其他语句
-1 失败 不会返回,会继续在该行代码位置阻塞等待解锁;
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:该函数的操作与加锁操作功能相反,用于已经加锁的
互斥锁进行解锁操作;
参数:mutex 要解锁的互斥锁
返回值:成功 0 互斥锁解锁
失败 -1
注意:加锁和解锁的目标对象针对的是代码行;
加锁==解锁之间的代码属于原子操作;
互斥锁存在的问题:不能指定执行线程的次序,有可能出现抢锁执行现象;
销毁互斥锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:该函数用于互斥锁的销毁操作,目的是在使用互斥锁
的时候需要重新初始化;
参数: mutex 互斥锁;
返回值:成功 0
失败 -1;
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int x = 0;
//pthread_mutex_t mutex; 定义一个全局互斥锁
void * fun1(void * arg)
{
pthread_mutex_t *pmutex = (pthread_mutex_t *)arg;
pthread_mutex_lock(pmutex); ///开始互斥锁加锁
x = 0;
while(1)
{
sleep(1);
printf("fun1 x-- = %d \n",x-=2);
if(x <= 10) break;
}
pthread_mutex_unlock(pmutex); ///互斥锁解锁
pthread_exit(0);
}
void * fun2(void * arg)
{
pthread_mutex_t *pmutex = (pthread_mutex_t *</