【问题标题】:Semaphore values in cc中的信号量值
【发布时间】:2015-01-01 19:53:31
【问题描述】:

如果我理解正确,来自这篇文章: http://www.csc.villanova.edu/~mdamian/threads/posixsem.html

然后在每个线程由于来自其他地方的 sem_post(&sem1) 而从 sem_wait(&sem1) 传递之后,信号量的值应该增加。 所以如果我这样做:

    sem_wait(&sem1);
    int sval2;
    if (sem_getvalue(&sem1, &sval2) == 0){
        printf("Semaphore value: %d\n", sval2);
    }   

sem_init(&sem1, 0, 0);

之前执行过,我的输出应该是:

1
2
3
4
etc......

我问这个,因为在我的项目中,事件似乎遵循正确的顺序,但是当我执行 sem_getvalue 时,一些信号量的输出保持不变 (0),而另一些信号量会 +1 一次,然后保持不变常数 (1),而在其他情况下,它会上升和下降(1,然后是 3,然后是 4,然后是 5,然后是 3,等等...)。

【问题讨论】:

    标签: c posix semaphore


    【解决方案1】:

    sem_post 将信号量的值加一。 sem_wait 递减信号量的值(减一),前提是它不会低于零(否则它会阻塞)。 (有关更多技术细节,请参阅man sem_wait。)

    您看到的值是由于 sem_waitsem_post 被调用的顺序。

    【讨论】:

      【解决方案2】:

      sem_post 递增,sem_wait 递减(并阻塞直到信号量具有正值,以免将其递减到零以下)。您使用sem_getvalue 观察到的值将取决于线程运行的顺序以及各种递增和递减的顺序。

      【讨论】:

      • 哦,好吧,我错过了递减的部分,我的看法是它一直等到信号量的值等于 sem_wait 获得的值(基于它被调用的顺序)。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多