所以我的问题很简单,我需要知道有多少线程在等待信号量(排队)。最初,我认为sem_getvalue会返回一个负数,显示被信号量阻塞的线程数,但它只会下降到0并停留在那里。我还尝试声明一个全局变量(如int waiting ),并在使用waiting++调用sem_wait之前对其进行增量,并在调用之后对其进行递减,但这个解决方案似乎不起作用(我对此感到困惑,因为我认为增量和递减不会导致竞争状况)。我看过semaphore.h,但似乎没有一个函数能实现我想要的功能。在这里编写时,我想出了一个不完美的解决方案:声明第二个信号量,然后用0初始化它,然后在实际的sem_wait之前对它调用sem_wait,在实际等待之后调用等待。还没有测试它是否工作,但即使是这样,它似乎有点烦躁,一个不太好!
发布于 2022-01-24 08:50:43
没有进入为什么你有很多线程等待一个信号量,解决这个问题的一个方法是你已经尝试过的,有一个计数器。这个计数器必须是*atomic*,或者执行如下操作:
pthread_mutex_t wait_m = PTHREAD_MUTEX_INITIALIZER;
int wait_counter = 0;
void inc_wait_counter()
{
pthread_mutex_lock(&wait_m);
wait_counter ++;
pthread_mutex_unlock(&wait_m);
}
void dec_wait_counter()
{
pthread_mutex_lock(&wait_m);
wait_counter --;
pthread_mutex_unlock(&wait_m);
}
int get_wait_counter()
{
/* No need to lock here for only reading wait_counter */
return wait_counter;
}然后就像这样:
inc_wait_counter();
sem_wait(...);
dec_wait_counter();注意:使用原子整数代替,我建议检查:How to do an atomic increment and fetch in C?
https://stackoverflow.com/questions/70830928
复制相似问题