linux生产者消费者程序,[操作系统]linux环境下使用c语言操作线程互斥体,实现生产者和消费者同步程序...

[操作系统]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;

}

程序运行结果,可以看出随机数成对出现,表示同步成功。

bc91bb04e6e9c61e24c974e4440db8f2.gif