linux生产者消费者(2)

一、posix信号量

信号量基础知识http://blog.csdn.net/xiajun07061225/article/details/8467853

二、示例代码

#include
#include 
     
#define BUFFER_SIZE 4 
     
/* 循环缓冲区中的整数 */  
struct data {
	int buffer[BUFFER_SIZE];   /* 实际数据 */
	int readpos, writepos;    /* 职位的阅读和写作 */
 };

struct data test_data;
sem_t not_full;//当缓冲区不满时,生产者可以生产数据
sem_t not_empty;//当缓冲区不空时,消费者可以消费数据
 
void *producer(void)  
{
	int n = 1;
	while(1)
    {
		sem_wait(¬_full);
		sleep(1);
		printf("------producer data[%d] = %d\n", test_data.writepos,n);
		test_data.buffer[test_data.writepos] = n++;
		test_data.writepos = (test_data.writepos + 1) % BUFFER_SIZE;
		sem_post(¬_empty);
    }
}

void *consumer(void)  
{
    while (1)
    {
		sem_wait(¬_empty);
		sleep(rand()%3);
		printf("-consumer data[%d] = %d \n", test_data.readpos,test_data.buffer[test_data.readpos]);
		test_data.readpos = (test_data.readpos + 1) % BUFFER_SIZE;
		sem_post(¬_full);
	}
}
 
int main(void)  
{
	int res;
	test_data.readpos = 0;
	test_data.writepos = 0;
	res = sem_init(¬_full, 0, BUFFER_SIZE);//producer
    if (res != 0)
    {
        printf("Semaphore initialization failed");
		return -1;
    }
	res = sem_init(¬_empty, 0, 0);//consumer
    if (res != 0)
    {
        printf("Semaphore initialization failed");
		return -1;
    }
	pthread_t th_producer, th_consumer;      //定义线程号 
    void *retval;               //返回任意类型的指针 
    pthread_create(&th_producer, NULL, producer, 0);   //创建并跳转到参数为指向线程标识符的指针th_a线程函数producer 
    pthread_create(&th_consumer, NULL, consumer, 0);   //创建并跳转到参数为指向线程标识符的指针th_b线程函数consumer 
    /* 等到生产者和消费者完成 */  
    pthread_join(th_producer, &retval);    //等待线程号为th_a线程函数结束,并将返回值保存入retval 
    pthread_join(th_producer, &retval);        //等待线程号为th_b线程函数结束,并将返回值保存入retval 
	return 0;
 }



三、演示效果

linux生产者消费者(2)_第1张图片

你可能感兴趣的:(生产者消费者,C语言(基础,Linux,C))