2016-03-03 3 views
-1

Я работаю над проектом, в котором «студенческая» нить будет использовать семафор, чтобы разбудить поток «TA».sem_wait(), похоже, действительно не ждет. Что я могу сделать неправильно?

У меня есть семафор под названием studentNeedsHelp_Sem

я инициализировать его с sem_init(&studentNeedsHelp_Sem, 0 ,0);

Перед любой из моих студентов или ТА нитей даже созданы, я включаю эти 3 линии:

printf("DEBUG WAITING\n"); 
sem_wait(&studentNeedsHelp_Sem); 
printf("DEBUG DONE WAITING\n"); 

Что должно произойти: DEBUG WAITING печатается, тогда нам нужно подождать, пока студент действительно нуждается в помощи (и звонит sem_post(&studentNeedsHelp_Sem)), чтобы увидеть DEBUG DONE WAITING

происходит: оба печатаются до того, как мои ученические потоки даже начнутся.

(я работаю в C на OSX, используя POSIX Pthreads)

Благодарим Вас за помощь!

+0

Где: 'studentNeedsHelp_Sem' указано? Нет шансов, что он уйдет, не так ли? –

+0

@MartinJames Объявлен глобально очень рано в файле через строку 'sem_t studentNeedsHelp_Sem;' –

+0

ОК, ну, я должен был спросить, семафоры нормально, ну, работа;) –

ответ

3

Проверьте возвращаемое значение sem_wait (как вы должны всегда делать всякий раз, когда вызов библиотечной функции или системного вызова). Вероятно, это отрицательно, что указывает на ошибку; посмотрите на errno или используйте perror, чтобы отобразить эту ошибку. Я не удивлюсь, если это EDEADLK.

Действительно, если нить не было начато, то, несомненно, некому будет размещать семафор. Так что sem_wait никогда не вернется вообще. Это тупик; ваша программа ждет чего-то, что, возможно, никогда не произойдет. Возможно, это то, что библиотека потоков OSX обнаруживает это и возвращает sem_wait с ошибкой, исходя из предположения, что это не то, что вы намеревались, и, по крайней мере, если sem_wait вернет вашу программу, есть шанс на восстановление.

+0

То же самое для 'sem_init'. Я рекомендую использовать 'perror()' – Superlokkus

+0

Вы правы, что 'sem_wait' возвращает -1. Теперь это вопрос почему ... Я знаю, что это вызывает тупик, я делал это специально для отладки. Но это хороший момент, возможно, компилятор увидел тупик и проигнорировал вызов ожидания. –

+0

@MGriest: Не компилятор, а библиотека потоков или код ядра. Это проверка времени выполнения, а не время компиляции. –

Смежные вопросы