1) Эта кодовая последовательность в Addr:
h->stateArr[id] = BUSY;
sleep(1);
h->arr[id] = h->arr[id] + ADD_VAL;
printf("add thread id and cell id %d: cell value %d->%d\n", id, h->arr[id]-ADD_VAL, h->arr[id]);
h->stateArr[id] = FREE;
Выполнено с заблокированным мьютексом; таким образом, Remove никогда не получит шанс увидеть состояние как что-либо, кроме FREE.
2) Нет гарантии, что владение мьютексом чередуется (afaik), но, по крайней мере, для правильной координации потоков вы никогда не должны полагаться на такие детали реализации. Это разница между работой и «случается с работой», которая обычно приводит к «привыкли работать» ...
Если вы поместите sleep () между мьютексной разблокировкой и мьютексной блокировкой, у вас может быть лучший случай, но на самом деле, он просто разблокирует его, а затем снова блокирует, так что система вполне может просто позволить это продолжает выполняться.
[Мне не хватило места в комментариях ...]:
Да, переменные условия здесь ничего не делают для вас. Идея условной переменной заключается в том, чтобы иметь возможность получать уведомления, когда по какому-либо общему возражению произошло значительное событие, такое как изменение состояния.
Например, водохранилище может иметь одну переменную условия для уровня воды. Мультиплексированы на это может быть много условий: уровень <1 м; уровень> 5м; уровень> 10м. Чтобы сохранить независимость системы (таким образом, работающую), бит, который обновляет уровень, может просто:
pthread_mutex_lock(&levellock);
level = x;
pthread_cond_broadcast(&newlevel);
pthread_mutex_unlock(&levellock);
Актеры, выполняющие условия, будут делать что-то вроде:
pthread_mutex_lock(&levellock);
while (1) {
if (level is my conditions) {
pthread_mutex_unlock(&levellock);
alert the media
pthread_mutex_lock(&levellock);
}
pthread_cond_wait(&newlevel, &levellock);
}
Таким образом, я могу добавить множество «мониторов состояния», не нарушая код установки уровня или систему в целом. Многое конечно, но освобождая мьютекс, пока я предупреждаю СМИ, я избегаю, чтобы моя система мониторинга воды полагалась на обработку тревоги.
Если вы знакомы с «публикацией / подпиской», вы можете найти это знакомым. Это принципиально та же модель, только PS скрывает кучу деталей.