Стандарт pthreads запрещает доступ к объекту в одном потоке, в то время как другой поток изменяет или может изменять его.Ваши функции wait
и signal
нарушают это правило, изменяя semaphore
(в signal
), в то время как поток, вызывающий wait
, может обращаться к нему.Вы также делаете это с counter
.
Если бы то, что вы делали в signal
и wait
, было бы законным, вам бы не понадобились signal
и wait
.Вы можете просто получить доступ к очереди точно так же, как вы напрямую semaphore
.Если очередь нуждается в защите (как, я надеюсь, вам это известно), то semaphore
тоже нуждается в защите и по той же причине.
Компилятору разрешено оптимизировать этот код:
while(semaphore<=0);
К этому коду:
if (semaphore<=0) { while (1); }
Почему?Потому что он знает, что никакой другой поток не может изменить semaphore
, пока этот поток может получить к нему доступ, поскольку это запрещено стандартом.Следовательно, нет смысла читать более одного раза.
Вам необходимо использовать настоящие семпахоры и / или замки.