Короткий ответ Все потоки, которые получают доступ к общим данным, должны получить блокировку, защищающую эти данные.
Длинный ответ Если считыватель не блокирует данные для чтения, поток может закончить чтение поврежденных данных, если записывающий поток записывает данные, пока читатель их читает. И в современном многоядерном / многопроцессорном мире не стоит полагаться на то, что любой тип данных атомарно безопасен для чтения или записи.
Edit (By Shahbaz) : На самом деле, в вашем примере Thread 2
всегда успешно блокирует мьютекс, поэтому синхронизация вообще не происходит. В вашем простом случае ответ также очень прост:
Thread 1:
while(1)
lock(shared_mutex)
read(shared_data)
unlock(shared_mutex)
Thread 2:
while(1)
lock(shared_mutex)
write(shared_data)
unlock(shared_mutex)