线程同步(互斥锁和条件变量)
完成下面程序:
由主线程创建两个线程,线程1负责向一块内存中写入2个数据,线程2负责从内存中读出数据,将两个数据相加的结果输出。使用条件变量和互斥锁结合的方式,实现线程的同步。
注意要点:
1.线程是共享资源,故此可以建立全局变量。
2.互斥锁的使用可以和条件变量相辅相成。
程序如下:
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
pthread_mutex_t mutex; //定义互斥锁
int signal=0; //定义条件变量 定义一个信号 signal 初始化为 0
int p1;
int p2;
int i=0;
void write();
void read();
int main()
{
pthread_t one;
pthread_t two;
char *import;
char *sum;
pthread_mutex_init(&mutex,NULL); //创建一个互斥锁
pthread_create(&one,NULL,(void*)&write,NULL); //write 写入函数
pthread_create(&two,NULL,(void*)&read,NULL);; //read 读取函数
pthread_join(one,(void*)&import); //线程等待
pthread_join(two,(void*)&sum); //线程等待
pthread_mutex_destroy(&mutex); //销毁互斥锁
return 0;
}
void read()
{
int ret;
while(1)
{
int sum;
pthread_mutex_lock(&mutex); //上锁
if(signal==1)
{
sum=p1+p2;
printf("p1=%d\n",p1);
printf("p2=%d\n",p2);
signal=0;
sum=printf("sum=%d\n",sum);
printf("\n");
}
pthread_mutex_unlock(&mutex); //解锁
if(i==3)
break;
}
pthread_exit(&ret); //退出线程
}
void write()
{
int j;
while(i<3)
{
pthread_mutex_lock(&mutex); //上锁
if(signal==0)
{
srand( (unsigned)time( NULL ) );//产生随机数的函数
for(j=i;j<3;j++)
{
p1=rand()%100+1; //产生0~100的随机数
p2=rand()%100+1; //产生0~100的随机数
}
i=i+1;
signal=1;
}
pthread_mutex_unlock(&mutex); //解锁
}
}