Я думаю, что ваша проблема может быть связана с тем, как вы (не) проверяете, что условия остаются в силе после получения семафора, или что сами условия проверки неверны.
У вас есть:
while(sharedData->evenSwap || sharedData->oddSwap)
{
// obtain lock on the shared vector
int commandCheck = sem_wait(&(sharedData->swapSem));
perror("semaphore lock");
// if lock was obtained
if (commandCheck == 0)
{
sharedData->oddSwap = false;
После того, как вы получите семафор, вам, вероятно, следует проверить, что либо sharedData->evenSwap
, либо sharedData->oddSwap
все еще имеет значение true, оставив семафор, если нет.Это стандартная идиома;вы проверяете, блокируете и перепроверяете, потому что статус мог измениться между первоначальной проверкой и временем, когда вы получили блокировку.
В соответствии с этой гипотезой вызовы perror()
изменяют время процессов, позволяя условиямоставаться неизменным дольше, чем при отсутствии вызовов perror()
.Итак, где-то есть проблема с синхронизацией.