/*thread_mutex.c*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_NUMBER 3
#define REPEAT_NUMBER 3
#define DELAY_TIME_LEVELS 10.0
pthread_mutex_t mutex;
void *thrd_func(void *arg)
{
int thrd_num = (int )arg;
int delay_time = 0,count =0;
int res;
/**互斥上锁*/
res = pthread_mutex_lock(&mutex);
if(res){
printf("Thread %d lock failed\n",thrd_num);
pthread_exit(NULL);
}
printf("Thread %d is starting \n",thrd_num);
for(count = 0; count <REPEAT_NUMBER;count++)
{
delay_time = (int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;
sleep(delay_time);
printf("\tThread %d :job %d delay = %d \n",thrd_num,count,delay_time);
}
pthread_mutex_unlock(&mutex); // 解开互斥锁
printf("Thread %d finished \n",thrd_num);
pthread_exit(NULL);
}
int main(void)
{
pthread_t thread[THREAD_NUMBER];
int no = 0,res;
void * thrd_ret;
srand(time(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("Create thread %d failed \n",no);
exit(res);
}
}
printf("Create tread 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 join failed \n",no);
}
/* 互斥锁解锁*/
// pthread_mutex_unlock(&mutex);
}
pthread_mutex_destroy(&mutex);
return 0;
}
使用是实验的源程序,我发现会报错,因为线程在创建的时候已经在执行了,不一定是线程0抢到了进程锁,我试了一下发现是进程2拿到了进程锁,而下面就是一直在等带进程0结束,而进程0又在等待进程2释放进程锁,所以,实验程序跑不下去了。我把释放进程锁放到了,子程序中,实验完成。