2010-08-16 50 views
2

递增POSIX信号量I的值有这种要求,其特征在于予有超过1。超过1

显然递增一POSIX信号量的值,存在在POSIX规范没有方式做到这一点。没有类似于sem_getvalue()的sem_setvalue()。仅仅因为这个限制,我不想回到System V信号量。

有没有其他方法可以做到这一点?或者我将不得不采用System V方式?

我在C/GNU/Linux上编程。

非常感谢提前。

回答

3

我有这样的要求,其中我有超过1 递增一个POSIX信号量的值有没有做到这一点任何其他方式?或者我将不得不采用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

这个实现有几个问题。变量count并不反映在信号量上等待的进程数量。而执行'decr()'的delta进程值较低的进程将优先于进程的delta值更高,这可能会导致饥饿。 – 2014-03-05 11:52:51

0

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

+0

这部分是真实的。其中一个选项是使增量原子。但是我想知道在POSIX中是否有一个“优雅”的替代方案(SysV的方式) – puffadder 2010-08-16 09:04:46

1

semctlsemop是你need.Use GETVAL SETVAL在smectl吸气剂和setter.Set sem_op sembuf结构到要执行semop使用时用旗语做什么。看到男人更多。

+0

这些工作在OP明确排除的System V信号量上。 – 2010-08-16 11:40:36

1

不,在使用sem_t时没有这种替代方案。如果您还没有这样做,请阅读linux上的sem_overview手册页。这里列出的所有调用都可以获得:初始化为特定值,递增和递减1。