我有一个程序,其中一个线程运行一个任务,当它无法再根据条件运行它时,它会等待:
void thread1() {
while(...) {
if(can_do_stuff) {
//do stuff
}
else {
sem_wait(&sem);
}
}
}
通过调用sem_post
,可以通过其他几个线程唤醒此线程(每个线程执行一个可导致thread1被唤醒的原因的单独任务):
void threadx() {
while(...) {
if(need_thread1_to_run) {
sem_post(&sem);
}
else {
//do stuff
}
}
}
然而,问题是每当thread1调用sem_wait
时,它需要等待,这基本上意味着信号量应该具有的最大值为0.理想情况下,如果它已经为0并且一个名为sem_post
的线程,该值不会改变。反正用C中的信号量来做这个吗?如果没有,C中是否有另一种同步方法可以做得更好?我认为线程可以在调用sem_getvalue
之前调用sem_post
以查看该值是否已经为0,但这不是线程安全的,我认为两个线程仍然可以同时调用sem_post
同一时间。我也认为条件变量可能是一种可能性,但是那些需要互斥量而我真的不需要互斥量,因此我希望有更简单的东西。