信号量简介
信号量是一种同步机制,用于限制对共享资源的访问。它通常用于解决进程或线程间的同步问题,例如生产者-消费者问题。
- 初始化:信号量需要在使用前通过sem_init函数进行初始化。
- 等待:通过 sem_wait 函数使信号量减 1,如果信号量的值为 0,则调用线程会被阻塞,直到信号量的值大于 0。
- 发布:通过 sem_post 函数使信号量加 1,如果有被阻塞的线程等待该信号量,则其中一个线程会被唤醒。
- 销毁:通过sem_destory函数对信号量进行销毁。
信号量初始化:
sem_init(&entrySem, 0, 0);
sem_init(&slotSem, 0, BUFFER_SIZE);
entrySem 初始值为 0,表示缓冲区中元素个数。
slotSem 初始值为缓冲区大小,表示缓冲区中空闲槽的数量。
生产者线程:
sem_wait(&slotSem):空闲槽的数量减一。
生产数据并放入缓冲区。
sem_post(&entrySem): 缓冲区中元素个数加一。
消费者线程:
sem_wait(&entrySem):元素个数减一。
消费数据并从缓冲区取出。
sem_post(&slotSem):空闲槽的数量加一。
信号量销毁:
sem_destroy(&q->slotSem);
sem_destroy(&q->entrySem);
通过这种方式,信号量 entrySem 确保了对缓冲区的互斥访问,而 slotSem 控制了缓冲区中空闲和已用槽的数量,实现了生产者和消费者之间的同步。