首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待信号量的线程数

等待信号量的线程数
EN

Stack Overflow用户
提问于 2022-01-24 08:29:08
回答 1查看 469关注 0票数 1

所以我的问题很简单,我需要知道有多少线程在等待信号量(排队)。最初,我认为sem_getvalue会返回一个负数,显示被信号量阻塞的线程数,但它只会下降到0并停留在那里。我还尝试声明一个全局变量(如int waiting ),并在使用waiting++调用sem_wait之前对其进行增量,并在调用之后对其进行递减,但这个解决方案似乎不起作用(我对此感到困惑,因为我认为增量和递减不会导致竞争状况)。我看过semaphore.h,但似乎没有一个函数能实现我想要的功能。在这里编写时,我想出了一个不完美的解决方案:声明第二个信号量,然后用0初始化它,然后在实际的sem_wait之前对它调用sem_wait,在实际等待之后调用等待。还没有测试它是否工作,但即使是这样,它似乎有点烦躁,一个不太好!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-24 08:50:43

没有进入为什么你有很多线程等待一个信号量,解决这个问题的一个方法是你已经尝试过的,有一个计数器。这个计数器必须是*atomic*,或者执行如下操作:

代码语言:javascript
复制
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;
}

然后就像这样:

代码语言:javascript
复制
inc_wait_counter();
sem_wait(...);
dec_wait_counter();

注意:使用原子整数代替,我建议检查:How to do an atomic increment and fetch in C?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70830928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档