1、semaphore 的这种信号量不仅可用于同一进程的线程同步,也可以用于不同进程间同步。
一个生产者-消费者例子:生产者不停的向一个固定大小的环形队列中添加数据,消费者从环形队列中清零数据,如果生产者积累的数据大于环形队列长度,则等待消费者清除数据有空位后再生产。
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#define NUM 5
int queue[NUM];
sem_t blank_number, product_number;
void *producer(void *arg)
{
int p = 0;
while(1){
sem_wait(&blank_number);
queue[p] = rand() % 1000 + 1;
printf("produce %d\n", queue[p]);
p = (p + 1) % NUM;
sem_post(&product_number);
sleep(1);
//sleep(rand()%5);
}
}
void *consumer(void *arg)
{
int c = 0, i;
while(1) {
sem_wait(&product_number);
for(i=0; i < NUM; i++) {
printf(&#