Linux多线程(九)条件变量3

提出问题:在处理同步的问题上,还存在这样一个现象,假设有一个项目(共享资源),有研发组(线程1)和测试组(线程2),研发组完成设计后,需要交给测试组测试,同时测试完成第一阶段测试后,反馈问题给研发组,此时研发组继续研究,解决问题,再一次较由测试组测试,不断相互同步,直至项目结束。

实验源码:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct
{
   int value;
   int is_wait;
   int is_wait2;
   pthread_cond_t cond;
   pthread_mutex_t mutex;
   pthread_cond_t cond2;
   pthread_mutex_t mutex2;
}Result; 
void set_data(Result *r,int value)
{
   r->value=value;
}
int get_data(Result *r)
{
  return r->value;
}
void * func_set(void *arg)
{
   Result *r=(Result *)arg;
   int i=1;
   for(;i<=100;i++)
   {
     set_data(r,i+100);
     printf("1:the pthread %lx has set the date %d\n",pthread_self(),i+100);
     pthread_mutex_lock(&r->mutex);
     while(!r->is_wait)
     {
        pthread_mutex_unlock(&r->mutex);
        usleep(1000);
        pthread_mutex_lock(&r->mutex);
     }
     pthread_mutex_unlock(&r->mutex);
     printf("1:I am ready to broadcast\n");
     pthread_cond_broadcast(&r->cond);
     //这个时候线程等待另外一个线程通知
     pthread_mutex_lock(&r->mutex2);
     r->is_wait2=1;
     pthread_cond_wait(&r->cond2,&r->mutex2);
     printf("2:I have receive the infomation2\n");
     pthread_mutex_unlock(&r->mutex2);
     int res=get_data(r);
     printf("2:the pthread %lx read the result is %d\n",pthread_self(),res);
     //代码包括在这里
  }
}
void *func_get(void *arg)
{
   Result *r=(Result *)arg;
   int i=1;
   for(;i<=100;i++)
   {
  pthread_mutex_lock(&r->mutex);
    r->is_wait=1;
    pthread_cond_wait(&r->cond,&r->mutex);
    printf("1:I have receive the infomation\n");
    pthread_mutex_unlock(&r->mutex);
    int res=get_data(r);
  printf("1:the pthread %lx read the result is %d\n",pthread_self(),res);
        //现在是双向的,所以需要去判断另外一个线程是否准备好,注意这里要用第二把所和第二个条件变量
        set_data(r,i+100);
        printf("2:the pthread %lx has set the date %d\n",pthread_self(),i+100);
        pthread_mutex_lock(&r->mutex2);
        while(!r->is_wait2)
        {
            pthread_mutex_unlock(&r->mutex2);
            usleep(1000);
            pthread_mutex_lock(&r->mutex2);
        }
        pthread_mutex_unlock(&r->mutex2);
        printf("2:I am ready to broadcast2\n");
        pthread_cond_broadcast(&r->cond2);
        //代码写在这里
    }
}
int main(void)
{
   int err;
   pthread_t rabbit,turtle;
   Result r;
   r.is_wait=0;
   pthread_mutex_init(&r.mutex,NULL);
   pthread_cond_init(&r.cond,NULL);
   pthread_mutex_init(&r.mutex2,NULL);
   pthread_cond_init(&r.cond2,NULL);
   if((err=pthread_create(&rabbit,NULL,func_set,(void *)&r))!=0)
   {
      perror("pthread_create error");
   }
   if((err=pthread_create(&turtle,NULL,func_get,(void *)&r))!=0)
   {
      perror("pthread_create error");
   }
   pthread_join(rabbit,NULL);
   pthread_join(turtle,NULL);
   pthread_mutex_destroy(&r.mutex);
   pthread_cond_destroy(&r.cond);
   pthread_mutex_destroy(&r.mutex2);
   pthread_cond_destroy(&r.cond2);
   printf("control thread id: %lx\n",pthread_self());
   printf("finished!\n");
   return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38211852/article/details/80404099