提出问题:在处理同步的问题上,还存在这样一个现象,假设有一个项目(共享资源),有研发组(线程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;
}