函数列表
函数 | 说明 |
---|
sem_init | 初始化信号量 |
sem_wait | 等待信号量大于0 |
sem_post | 信号量+1 |
sem_getvalue | 获取信号量的值到参数2 |
sem_destroy | 销毁信号量,只有初始化之后的才能销毁 |
生产者消费者模型
sem_t sem;
class Phone {
private:
int phoneId;
public:
explicit Phone(int id) : phoneId(id) {
}
int getPhoneId() {
return phoneId;
}
};
int productPhoneId;
std::list<Phone> phoneList;
void *phone_producer_runnable(void *params) {
while (true) {
sleep(random() % 10);
Phone phone(productPhoneId++);
phoneList.push_back(phone);
sem_post(&sem);
}
return nullptr;
}
void *phone_consumer_runnable(void *params) {
while (true) {
sem_wait(&sem);
Phone phone = phoneList.front();
phoneList.pop_front();
}
return nullptr;
}
void testProducerConsumer2() {
sem_init(&sem, 0, 0);
pthread_t thread1;
pthread_create(&thread1, nullptr, phone_producer_runnable, nullptr);
pthread_t thread2;
pthread_create(&thread2, nullptr, phone_consumer_runnable, nullptr);
}
信号量和条件变量区别
- 使用条件变量可以一次唤醒所有等待者,而信号量不能唤醒
- 条件变量需要在等待前持有锁,而信号量不需要
- 信号量始终有一个值(状态的),而条件变量是没有