Семафоры и мультипоточность. Ошибка в sem_trywait()


Семафоры и мультипоточность. Ошибка в sem_trywait()

20.11.2018 06:24:57 Просмотров 83 Источник

День добрый. Работаю с семаформами, по загадочным для меня причинам даже если сразу посли инициализации семафора пытаюсь им воспользоваться - не получается, sem_trywait возвращает -1.

for(int i = 0; i< 5; i++)
{
    sem_init(&utensils[i], 0, 1);
    sem_trywait(&utensils[i]); //returns -1 always! 

    //create new thread processes for the philosophers
    pthread_create(&phs[i], NULL, philosopher, &num[i]);
    //check if the threads are created
    assert(!(phs[i] == 0));

}
У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/909247/%d0%a1%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-%d0%b8-%d0%bc%d1%83%d0%bb%d1%8c%d1%82%d0%b8%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%b2-sem-trywait#comment1494890_909247
таки работает. А как нужно?
https://ru.stackoverflow.com/questions/909247/%d0%a1%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-%d0%b8-%d0%bc%d1%83%d0%bb%d1%8c%d1%82%d0%b8%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%b2-sem-trywait#comment1494896_909247
Так было сказано на паре. На самом деле, потому что функция сама по себе просто void и компайлер выдавал предупреждения - но сейчас поменяла на void* и все равно не работает.
https://ru.stackoverflow.com/questions/909247/%d0%a1%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-%d0%b8-%d0%bc%d1%83%d0%bb%d1%8c%d1%82%d0%b8%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%b2-sem-trywait#comment1494897_909247
"На паре" вам сказали чушь. "Компайлер выдавал предупреждения" и "все равно не работает" - это бесполезное словоблудие. Приводите конкретную информацию - объявления функций, сообщения компилятора.
https://ru.stackoverflow.com/questions/909247/%d0%a1%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-%d0%b8-%d0%bc%d1%83%d0%bb%d1%8c%d1%82%d0%b8%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%b2-sem-trywait#comment1494904_909247
errno равняется 9 после trywait. Сразу после инициализации - 78. При этом просто wait работает (тоже выдает -1, но в последствии получает семафор) За указание на то, что (void*) не нужно использовать - спасибо.
https://ru.stackoverflow.com/questions/909247/%d0%a1%d0%b5%d0%bc%d0%b0%d1%84%d0%be%d1%80%d1%8b-%d0%b8-%d0%bc%d1%83%d0%bb%d1%8c%d1%82%d0%b8%d0%bf%d0%be%d1%82%d0%be%d1%87%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d0%b2-sem-trywait#comment1495043_909247
код в вопросе правильный.... стоит расширить его до полноценного минимального компилируемого примера...

Ответы - Семафоры и мультипоточность. Ошибка в sem_trywait() / Семафоры и мультипоточность. Ошибка в sem_trywait()

Является ответом!
Maria Lifshits

21.11.2018 04:20:49

Итак. Код правильный, ошибок с ним нет. Дело было в том, что я использую операционную систему Apple - в которой семафоры deprecated, поэтому инициализация не выполнялась. При использовании Linux - никаких проблем.

Помочь в развитии проекта:
Закрыть X