将POSIX信号量的值增加1以上

时间:2010-08-16 08:56:16

标签: c linux posix semaphore

我有这个要求,其中我必须将POSIX信号量的值增加1以上。

显然,POSIX规范中没有办法做到这一点。没有与sem_getvalue()类似的sem_setvalue()。我不想仅仅因为这个约束而回到System V信号量。

有没有其他方法可以实现这一目标?或者我必须采用System V的方式吗?

我在GNU / Linux上用C编程。

非常感谢提前。

4 个答案:

答案 0 :(得分:3)

  

我有这个要求,其中我必须将POSIX信号量的值增加1以上。   有没有其他方法来实现这一目标?或者我必须采用System V的方式吗?

那你的问题到底是什么?如何实现接口不支持的东西?或者如何使用POSIX创建类似semaphore的结构?

如果这是稍后,在使用像SysV这样的重枪之前,你总是可以使用pthread_mutex_t / pthread_cond_t对来实现几乎任何包含信号量的多线程同步原语。

例如,未经测试:

typedef cool_sem {
    pthread_mutex_t guard;
    pthread_cond_t cond;
    int count;
} cool_sem_t;

void init( cool_sem_t *s )
{
    pthread_mutex_init( &s->guard, 0 );
    pthread_cond_init( &s->cond, 0 );
    s->S = 0;
}

void incr( cool_sem_t *s, unsigned delta )
{
    assert( s );
    pthread_mutex_lock( &s->guard );
    s->S += delta;
    pthread_cond_broadcast( &s->cond );
    pthread_mutex_unlock( &s->guard );
}

void decr( cool_sem_t *s, unsigned delta )
{
    assert( s );
    pthread_mutex_lock( &s->guard );
    do {
        if (s->S >= delta) {
            s->S -= delta;
            break;
        }
        pthread_cond_wait( &s->cond, &s->guard );
    } while (1);
    pthread_mutex_unlock( &s->guard );
}

答案 1 :(得分:1)

semctlsemop是你需要的。在smectl中使用GETVAL SETVAL获取getter和setter。将 sembuf 结构中的sem_op设置为你想要用信号量做的事情当使用semop时。见男人了解更多。

答案 2 :(得分:1)

使用sem_t时,没有这样的选择。如果您还没有这样做,请阅读linux上的sem_overview手册页。在那里列出的调用是你可以获得的:初始化为特定值,递增和递减1。

答案 3 :(得分:0)

如果这是完整的规范,我认为你的老师希望你提出一种机制,允许你以原子方式增加一个以上的信号量。所以我的猜测是你的任务之一是同步增量。