版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27312943/article/details/79084781
一 互斥锁
互斥锁机制主要包括以下基本函数
互斥锁初始化 pthread_mutex_init()
互斥锁上锁 pthread_mutex_lock()
互斥锁判断上锁 pthread_mutex_trylock()
互斥锁解锁 pthread_mutex_unlock()
删除互斥锁 pthread_mutex_destory()
二 实例
在thread.c的基础上加入互斥锁,实现原本独立与无序的多个线程按照顺序执行
/*在thread.c的基础上加入互斥锁功能,*/
//多线程是并发执行,没有固定的顺序
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define THREAD_NUMBER 3 /*线程数*/
#define REPEAT_NUMBER 5 /*每个线程中的小任务数*/
#define DELAY_TIME_LEVELS 10.0 /*小任务之间的最大时间间隔*/
pthread_mutex_t mutex;
void *thrd_func(void *arg)
{
//线程函数例程
int thrd_num=(int)arg;
int delay_time=2;
int count=0;
int res;
//互斥锁上锁
/*********************
函数原型: int pthread_mutex_lock(pthread_mutex_t *mutex)
函数参数: mutex 互斥锁
返回值: 成功 0
失败 -1
*********************/
res=pthread_mutex_lock(&mutex);
if(res)
{
printf("thread %d lock filed\n",thrd_num);
pthread_exit(NULL);
}
printf("thread %d is starting\n",thrd_num);
for(count=0;count<REPEAT_NUMBER;count++)
{
/*RAND_MAX 是 <stdlib.h> 中伪随机数生成函数 rand 所能返回的最大数值*/
//delay_time=(int)(rand()* DELAY_TIME_LEVELS/(RAND_MAX))+1;
sleep(delay_time);
printf("thread %d: job %d,delay=%d\n",thrd_num,count,delay_time);
}
printf("Thread %d finished\n",thrd_num);
pthread_mutex_unlock(&mutex);
/*******************
函数原型:void pthread_exit(void *retval)
函数参数: retval线程结束时的返回值,可由其他函数如pthread_join()获取
******************/
pthread_exit(NULL);
}
int main()
{
pthread_t thread[THREAD_NUMBER];
int no=0,res;
void *thrd_ret;
srand(time(NULL));
//初始化互斥锁
/******************************
函数原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
函数参数: mutex 互斥锁
attr PTHREAD_MUTEX_INITIALIZER 创建快速互斥锁
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 创建递归互斥锁
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP 创建检错互斥锁
函数返回值: 成功 0
失败 返回错误码
***************************/
pthread_mutex_init(&mutex,NULL);
for(no=0;no<THREAD_NUMBER;no++)
{
/*创建多线程*/
res=pthread_create(&thread[no],NULL,thrd_func,(void*)no);
if(res!=0)
{
//创建线程失败
printf("thread %d join failed\n",no);
exit(res);
}
}
printf("creat threads success\n waiting for threads to finish...\n");
for(no=0;no<THREAD_NUMBER;no++)
{
//等待线程结束
res=pthread_join(thread[no],&thrd_ret);
if(!res)
{
printf("thread %d joined\n",no);
}
else
{
printf("thread %d joined fail\n",no);
}
//互斥锁解锁
/*********************
函数原型:int pthread_mutex_unlock(pthread_mutex_t *mutex)
函数参数:mutex 互斥锁
返回值: 成功 0
**********************/
//pthread_mutex_unlock(&mutex);
}
//消除互斥锁
pthread_mutex_destroy(&mutex);
return 0;
}
运行结果