线程之间的同步与互斥mutex

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define THREAD_NUMBER  3//3
#define REPEAT_NUMBER  3
#define DELAY_TIME_LEVELS  5.0
pthread_mutex_t mutex;

void *thrd_func(void *arg)
{
 int thrd_num = (int)arg;
 int delay_time = 0;
 int 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++)
 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);
 }
 printf("Thread %d finished\n", thrd_num);printf("AAAAA\n");
 pthread_exit(NULL);printf("AAAAA\n");
}

int main(void)
{
 pthread_t thread[THREAD_NUMBER];
 int no = 0, res;
 void * thrd_ret;

 srand(time(NULL));

 //*init mutex_lock*/
 pthread_mutex_init(&mutex, NULL);
 for(no; no < THREAD_NUMBER; no++)
 {
  res = pthread_create(&thread[no], NULL, thrd_func, (void*)no);
//res = pthread_create(&thread[0], NULL, thrd_func, (void*)no);
printf("res of pthread_create %d is:%d\n", no,res);
  if(res !=0)
  {
   printf("Create Thread %d failed\n", no);
   exit(res);
  }
 }

 printf("Craete threads sucess\nWaiting for threads to finish...\n");
 for(no = THREAD_NUMBER-1; no >=0; 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;
}

 

原本代码

 for(no ; 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);
 }

因为先进行线程2,后进行1,0线程,所以把for循环改了,至于原理,还在探讨中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值