> > Потоки надо создавать не с помощью CreateThread, а > > _beginthreadex > > :)) > Это решает проблему или просто позволяет улыбнуться?
В данном случае - очень вряд ли. Лично у меня в single-threaded приведенный код честно выдал 20 разных чисел и так, что, в принципе, вполне объяснимо.
Все эти single-threaded, multi-threaded важны исключительно для функций из стандартной библиотеки, которые используют какие-то переменные для хранения промежуточных результатов. Берем ту же пару srand/rand. Srand инициализирует генератор псевдослучайных чисел, полученное значение надо где-то сохранить. В случае использования multithreaded и _beginthreadex для каждого потока все эти глобальные переменные будут своими. Т.е. srand, выполненный в главном потоке, не будет иметь никакого отношения к randам из дочерних потоков, и все они просто запустятся непроинициализированными (есть еще шанс, что дочерние потоки унаследуют значения глобальных библиотечных переменных от родительского, но зуб не дам, надо смотреть). CreateThread весь этот механизм обходит стороной, и в результате в сочетании с single-threaded все должно работать, как задумано.
Но вообще, гораздо корректнее было бы инициализировать srand в каждом потоке, отталкиваясь от идентификатора потока и времени.
|