linux生产者消费者(2)

来源:互联网 发布:梦幻西游数据号怎么弄 编辑:程序博客网 时间:2024/06/06 19:00

一、posix信号量

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

二、示例代码

#include<pthread.h>#include<semaphore.h>      #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(&not_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(&not_empty);    }}void *consumer(void)  {    while (1)    {sem_wait(&not_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(&not_full);}} int main(void)  {int res;test_data.readpos = 0;test_data.writepos = 0;res = sem_init(&not_full, 0, BUFFER_SIZE);//producer    if (res != 0)    {        printf("Semaphore initialization failed");return -1;    }res = sem_init(&not_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; }



三、演示效果

0 0