等待信号量的线程数

Number of threads waiting for semaphore

所以我的问题很简单,我需要知道有多少线程在等待信号量(正在排队)。最初我认为 sem_getvalue 会 return 一个负数,显示被信号量阻塞的线程数,但它只下降到 0 并保持在那里。我还尝试声明一个全局变量,如 int waiting 并在使用 waiting++ 调用 sem_wait 之前递增它,并在调用后递减它,但似乎这个解决方案不起作用(我是感到困惑,因为我认为递增和递减不会导致竞争条件)。我查看了 semaphore.h,但 none 的功能似乎可以满足我的要求。 写到这里,我想出了一个不完美的解决方案,即声明第二个信号量并用 0 初始化它,然后在实际 sem_wait 之前调用 sem_post 并在实际等待之后等待。还没有测试它是否有效,但即使它似乎有点 hacky 也不是很好!

无需深入了解为什么有很多线程在等待信号量,解决此问题的一种方法是您已经尝试过的方法,即使用计数器。 这个计数器必须是 *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?