Увеличение значения семафоров POSIX более чем на 1 - PullRequest
2 голосов
/ 16 августа 2010

У меня есть это требование, при котором я должен увеличить значение семафора POSIX более чем на 1.

Очевидно, в спецификации POSIX нет способа сделать это.Нет sem_setvalue (), подобного sem_getvalue ().Я не хочу возвращаться к семафорам System V только из-за этого ограничения.

Есть ли альтернативный способ сделать это?Или мне придется пойти по пути System V.

Я программирую на C на GNU / Linux.

Большое спасибо заранее.

Ответы [ 4 ]

3 голосов
/ 16 августа 2010

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

semctl и semop - это то, что вам нужно. Используйте GETVAL SETVAL в smectl для getter и setter.Set sem_op в sembuf struct, что вы хотите сделать с семафором при использовании semop. Смотри мужчину больше.

1 голос
/ 16 августа 2010

Нет такой альтернативы при работе с sem_t. Если вы еще этого не сделали, прочитайте справочную страницу sem_overview в linux. Все перечисленные вызовы - это все, что вы можете получить: инициализация определенного значения, увеличение и уменьшение на единицу.

0 голосов
/ 16 августа 2010

Если это полная спецификация, я думаю, что ваш учитель хочет, чтобы вы разработали механизм, который позволит вам увеличить семафор более чем на один атом. Поэтому я предполагаю, что одной из ваших задач является синхронизация приращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...