У меня есть это требование, в котором я должен увеличивать значение семафора 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 );
}