if (ret != 0) { printf("sem_init error"); exit(0); } ret = sem_init(&product_sem, 0, 0); //初始化信号量product_sem为0,开始时缓冲池中没有数据 if (ret != 0) { printf("sem_init error"); exit(0); } for (i = 0; i < PRODUCER_NUM; i++) { //创建生产者线程 ret =pthread_create(&producer_id[i], NULL, producer_fun, (void*)i); if (ret != 0) { printf("producer_id error"); exit(0); } //创建消费者线程 ret = pthread_create(&consumer_id[i], NULL, consumer_fun, (void*)i); if (ret != 0) { printf("consumer_id error"); exit(0); } } for(i=0;i<PRODUCER_NUM;i++) { pthread_join(producer_id[i],NULL); pthread_join(consumer_id[i],NULL); } exit(0);
时间: 2024-03-08 14:45:37 浏览: 37
这段代码是一个生产者-消费者问题的解决方案,其中包括了初始化信号量以及创建生产者线程和消费者线程的代码。
首先,通过 `sem_init` 函数分别初始化了两个信号量 `room_sem` 和 `product_sem`。`room_sem` 用于控制缓冲池中的空闲空间数量,`product_sem` 用于控制缓冲池中的数据数量。初始化时,`room_sem` 的初始值为 `POOL_SIZE-1`,即缓冲池中最多可以容纳 `POOL_SIZE-1` 个数据;`product_sem` 的初始值为 0,表示缓冲池中还没有数据。
接着,代码通过 `pthread_create` 函数创建了 `PRODUCER_NUM` 个生产者线程和消费者线程,分别对应 `producer_fun` 和 `consumer_fun` 函数。这些线程在执行时,需要通过信号量来控制缓冲池中的数据数量和空闲空间数量。当生产者线程需要往缓冲池中写入数据时,需要首先申请 `room_sem` 信号量,如果缓冲池中还有空闲空间,则可以继续执行,否则需要等待其他线程释放空闲空间后才能继续执行。写入数据后,生产者线程会释放 `product_sem` 信号量,表示缓冲池中的数据数量加 1。当消费者线程需要从缓冲池中读取数据时,需要首先申请 `product_sem` 信号量,如果缓冲池中还有数据,则可以继续执行,否则需要等待其他线程写入数据后才能继续执行。读取数据后,消费者线程会释放 `room_sem` 信号量,表示缓冲池中的空闲空间数量加 1。
最后,通过 `pthread_join` 函数等待所有线程执行完成后退出程序。
阅读全文