您的位置:首页 > 其它

多线程 同步

2016-05-24 17:32 417 查看
/*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释放进程锁,所以,实验程序跑不下去了。我把释放进程锁放到了,子程序中,实验完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mutex pthread