Стандарты pthreads очень ясны, что вы не можете получить доступ к объекту в одном потоке, в то время как другой поток изменяет или может изменять его. Ваш код нарушает это правило.
Есть много причин для этого правила, но наиболее очевидным является следующее:
for (int c = 0; c < 1000000; c++)
{
counter++;
}
Вы хотите, чтобы ваш компилятор оптимизировал такой код. Вы хотите, чтобы он сохранил counter
в реестре или даже исключил l oop, если это возможно. Но без требования избегать потоков, перекрывающих модификации и доступ к одному и тому же объекту, компилятор должен был бы каким-то образом доказать, что никакой другой код в каком-либо другом потоке не может коснуться counter
во время работы этого кода.
приведет к тому, что огромное количество ценных оптимизаций станет невозможным для 99% кода, который не разделяет объекты между потоками, только потому, что компилятор не может доказать, что доступы могут перекрываться.
Это имеет гораздо больший смысл требуется код, который имеет перекрывающийся доступ к объекту, чтобы четко указывать, что они делают. И каждый стандарт потоков предоставляет хорошие способы сделать это, включая pthreads.
Вы можете использовать любой метод, чтобы предотвратить эту проблему, которая вам нравится. Использование мьютекса - самое простое и определенно то, чему вы должны научиться в первую очередь.