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

我有这个要求,我必须增加一个POSIX信号量的值超过1。

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

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

我在GNU / Linux的C编程。

非常感谢提前。

Solutions Collecting From Web of "将POSIX信号量的值增加1以上"

我有这个要求,我必须增加一个POSIX信号量的值超过1.有没有其他的方法来完成这个? 或者我将不得不去System V的方式?

那么你的问题真的是什么? 如何实现接口不支持的东西? 或者如何使用POSIX创建一个像信号量一样的结构?

如果是这样,在使用像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 ); } 

semctlsemop是你所需要的。在getctl和setter中使用smectl中的GETVAL SETVAL。在使用semop时,将sembuf结构中的sem_op设置为你想要做的信号量。 更多地看男子。

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

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