等待信号量的线程数
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?
所以我的问题很简单,我需要知道有多少线程在等待信号量(正在排队)。最初我认为 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?