c-等待信号量的线程数



所以我的问题很简单,我需要知道有多少线程在等待信号量(排队(。起初,我认为sem_getvalue会返回一个负数,显示信号量阻塞的线程数,但它只降到0并保持不变。我还试图声明一个像int waiting这样的全局变量,并在用waiting++调用sem_wait之前将其递增,并在调用之后将其递减,但这个解决方案似乎不起作用(对此我感到困惑,因为我认为递增和递减不会导致竞争条件(。我看过semaphore.h,但似乎没有一个函数能满足我的要求。在这里,我提出了一个不完美的解决方案,即声明第二个信号量并用0初始化它,然后在实际的sem_wait之前调用sem_post,在实际的等待之后调用等待。还没有测试过它是否有效,但即使有效,它看起来也有点粗糙——不太好!

在不了解为什么有很多线程在等待信号量的情况下,解决这个问题的一种方法是使用计数器。这个计数器必须是*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();

注意:我建议使用原子整数来检查:如何在C中进行原子增量和提取?

最新更新