эквивалентный декремент семафора на iphone - PullRequest
0 голосов
/ 25 октября 2011

Я нашел следующий пример семафора.В настоящее время я изучаю синхронизацию потоков.У меня есть несколько вопросов.

1) Если семафор инициализируется со значением ноль, и я вызываю semaphore_down, значения семафоров теперь -1 или semaphore_down просто проверяет, больше ли значение нуля, чем block?

2) Я пишу для IOS, и нет доступной функции semaphore_down.Что такое равнозначный?Это то же самое, что и semaphore_wait?

Я хочу, чтобы поток продюсера работал вечно, ожидая, когда ему не нужно производить, и пробуждаясь, когда он обходится без блокировки в других потоках.

Это похоже на то, что мне нужно, но предложения приветствуются.

 void reader_function(void);
    void writer_function(void);
    char buffer;
    Semaphore writers_turn;
    Semaphore readers_turn;
    main()
    {
    pthread_t reader;
    semaphore_init( &readers_turn );
    semaphore_init( &writers_turn );
    /* writer must go first */
    semaphore_down( &readers_turn );
    pthread_create( &reader, pthread_attr_default,
    (void *)&reader_function, NULL);
    writer_function();
    }
    void writer_function(void)
    {
    while(1)
    {
    semaphore_down( &writers_turn );
    buffer = make_new_item();
    semaphore_up( &readers_turn );
    }
    }
    void reader_function(void)
    {
    while(1)
    {
    semaphore_down( &readers_turn );
    consume_item( buffer );
    semaphore_up( &writers_turn );
    }
    }

1 Ответ

0 голосов
/ 25 октября 2011

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

Какую библиотеку семафоров вы используете?Объект-семафор, как правило, поддерживает только две операции: post и wait и, опционально, также методы инициализации и деинициализации.Итак, исходя из имен, ваш semaphore_wait должен быть таким же, как semaphore_down, но невозможно сказать, не увидев документацию вашей библиотеки семафоров.

В iOS также есть Семафоры POSIX , которые вы могли бы использовать вместо.

...