Я думаю, что этот код определенно не является потокобезопасным.
Прежде всего, переменная FilledIndex
не инициализируется: как указано cplusplus.com , если вы не отправляете значение конструктору, атомарная переменная остается в неинициализированном состоянии.
Это может привести к неожиданному поведению.
Другая проблема связана с условием выхода в главном потоке, поскольку оператор for в ReadThread
повторяется до 1023, поэтому FilledIndex
никогда не примет значение 1024 и основной поток никогда не завершится.
Но главная проблема заключается в непредсказуемости планирования ваших потоков: что гарантирует выполнение ReadThread
после основного? Ничего такого!
Так что вы не можете быть уверены, что зацикливаетесь на всех значениях массива. На самом деле, если вы попытаетесь выполнить вашу программу много раз, вы увидите, что выходные данные каждый раз отличаются и выводятся различные значения массива.
Например, если мы назовем ReadThread
как T , основной поток как M и массив как A , это возможные расписания (при условии A размера 5 для простоты):
- T T T M T на выходе будет A [2]
- М М Т М Т выход будет A [0] A [0] A [1]
На самом деле вы печатаете A [FilledIndex
] и не можете предсказать, как будет обновляться FilledIndex
, потому что это зависит от планирования потоков.
Я надеюсь, что вы поймете, что я пытаюсь сказать. По любым вопросам или разъяснениям, очевидно, я здесь! Я отвечу как можно скорее!