Мне интересно, как это происходит с тех пор, чтобы
необходимо создать еще одну итерацию цикла for, и это
Кстати, идентификатор потока обновляется другим значением, прежде чем структура
передается новому потоку и создается следующий поток.
Вы почти ответили на свой вопрос. Да, на следующей итерации цикла вы обновляете thread_id той же структуры, которую вы представили предыдущему потоку. Итак, что, по вашему мнению, произойдет, если предыдущий поток еще не прочитал свое значение идентификатора? Ответ: он может прочитать значение, предназначенное для следующего потока, вместо своего собственного.
В целом, у вас есть гонка данных, потому что элемент thread_id
совместно используется основным потоком и потоком, который он только что создал, они обращаются к нему без надлежащей синхронизации, * и один из обращений это запись. Программа, которая содержит гонку данных, имеет неопределенное поведение, поэтому потоки, получающие неправильные идентификаторы, - это наименьшее количество ваших забот.
Возможно, вы могли бы использовать семафор для обеспечения необходимой синхронизации и упорядочения между основным потоком и каждым новым, чтобы основной поток не изменял threadData
преждевременно или небезопасно. Но я думаю, что было бы проще и более общим дать каждому потоку отдельный, отдельный ThreadData
объект, независимо от того, был ли он динамически размещен или из обычного массива из них.
* Хотя новый поток защищает свой доступ мьютексом, этого недостаточно. Все доступы должны быть защищены одним и тем же мьютексом, чтобы обеспечить надлежащую синхронизацию. Более того, даже это не обеспечит необходимый относительный порядок записи и чтения.