超过1
递增POSIX信号量I的值有这种要求,其特征在于予有超过1。超过1
显然递增一POSIX信号量的值,存在在POSIX规范没有方式做到这一点。没有类似于sem_getvalue()的sem_setvalue()。仅仅因为这个限制,我不想回到System V信号量。
有没有其他方法可以做到这一点?或者我将不得不采用System V方式?
我在C/GNU/Linux上编程。
非常感谢提前。
我有这样的要求,其中我有超过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);
}
如果这是完整的规范,我认为你的老师希望你想出一个机制,允许你增加一个信号量不止一个原子。所以我的猜测是你的任务之一是同步增量。
这部分是真实的。其中一个选项是使增量原子。但是我想知道在POSIX中是否有一个“优雅”的替代方案(SysV的方式) – puffadder 2010-08-16 09:04:46
semctl
和semop
是你need.Use GETVAL SETVAL在smectl吸气剂和setter.Set sem_op sembuf结构到要执行semop使用时用旗语做什么。看到男人更多。
这些工作在OP明确排除的System V信号量上。 – 2010-08-16 11:40:36
不,在使用sem_t
时没有这种替代方案。如果您还没有这样做,请阅读linux上的sem_overview
手册页。这里列出的所有调用都可以获得:初始化为特定值,递增和递减1。
这个实现有几个问题。变量count并不反映在信号量上等待的进程数量。而执行'decr()'的delta进程值较低的进程将优先于进程的delta值更高,这可能会导致饥饿。 – 2014-03-05 11:52:51