[操作系统]linux环境下使用c语言操作线程互斥体,实现生产者和消费者同步程序
0
2012-01-28 13:00:07
/*
* mutex.c
*
* Created on: 2012-1-28
* Author: web
* 实现生产者和消费者同步,只有一个产品的情况。没用使用信号量。
* 本程序用随机数做产品
*/#include
#include
#include
#include
#include//产品随机数
int buffer_rand = -1; //两个线程互斥体初始化
pthread_mutex_t sp=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t sg=PTHREAD_MUTEX_INITIALIZER;//线程运行条件
int running = 1; //生产者线程函数
void *producter_f(void *arg)
{
while(running)
{
//锁定存入物品
pthread_mutex_lock(&sp);
//生产产品
buffer_rand=rand();
printf("生产随机数:%d\n",buffer_rand);
//解锁可消费
pthread_mutex_unlock(&sg);
}
}
//消费者线程函数
void *consumer_f(void *arg)
{
while(running)
{
//用sg表示有物品,锁定有物品
pthread_mutex_lock(&sg); if(buffer_rand==-1)
{
printf("线程生产消费互斥失败\n");
exit(-1);
} //消费产品
printf("消费随机数:%d\n",buffer_rand);
buffer_rand=-1; //用sp通知可存入
pthread_mutex_unlock(&sp);
}
}//入口主函数
int main(void)
{
//线程定义变量
pthread_t consumer_t;
pthread_t producter_t; //两个互斥体初始化,已用PTHREAD_MUTEX_INITIALIZER可以不用这句
pthread_mutex_init(&sp,NULL);
pthread_mutex_init(&sg,NULL); //初始时锁住消费者,不让消费。生产过后,才可以消费
pthread_mutex_lock(&sg);
//初始时解锁产生者,这句可不要,默认情况就是可以生产的
pthread_mutex_unlock(&sp); //建立生产者和消费者线程
pthread_create(&producter_t,NULL,(void*)producter_f,NULL); pthread_create(&consumer_t,NULL,(void *)consumer_f,NULL); //主进程休眠,让两个线程运行一段时间
usleep(500); //让两个线程退出
running = 0; //等待两个线程正常退出
pthread_join(consumer_t,NULL);
pthread_join(producter_t,NULL); //销毁两个互斥体
pthread_mutex_destroy(&sg);
pthread_mutex_destroy(&sp); return 0;
}
程序运行结果,可以看出随机数成对出现,表示同步成功。