Этот код при установке Multithreaded(Release) распечатывает одно и то же число. Single-Threaded не намного лучше :(
Если закрыть rand() критической секцией, то Multithreaded без эмоций ваще, а Single - что-то вроде...
Этот код при установке Multithreaded(Release) распечатывает одно и то же число. Single-Threaded не намного лучше :(
Если закрыть rand() критической секцией, то Multithreaded без эмоций ваще, а Single - что-то вроде...
Ну во-первыхникогдане вызывай из VC++ CreateThread, а вызывай _beginthreadex (в других языках ищи аналог (кроме асма, конечно:)).
Во-вторых, если у тебя несколько потоков, то не устанавливай переключатель на однопоточные либы - этонеправильно ибо они написаны дляоднопоточногоприложения.
Далее: я вижу уже написали, но повторю: в многопоточной рантайм библиотеке srand инициализирует переменную только своего потока, потому одинаковые числа и выводило. Так что srandнужновызывать в каждом потоке. Причём иного пути, как мне кажется, нет, и быть не может.
Вообще-то комбинируя неправильные действия (например, как у тебя: выбрав однопоточное приложение) можно добиться правильного внешнего результата, но это не правильно и обязательно скажется потом.
И последнее: купи книгу Рихтера и не мучайся - там всё это описано.
Thanx 21.05.01 07:37 Автор: я Статус: Незарегистрированный пользователь
> Ну во-первыхникогдане вызывай из VC++ CreateThread, а > вызывай _beginthreadex (в других языках ищи аналог (кроме > асма, конечно:)).
MSDN врет или у Рихтера заскок(?)
MSDN: A thread that uses functions from the C run-time libraries should use the beginthread and endthread C run-time functions for thread management rather than CreateThread and ExitThread. Failure to do so results insmall_memory_leaks_when_ExitThread_is_called
> Во-вторых, если у тебя несколько потоков, то не > устанавливай переключатель на однопоточные либы - это >неправильно ибо они написаны дляоднопоточного > приложения. > > Далее: я вижу уже написали, но повторю: в многопоточной > рантайм библиотеке srand инициализирует переменную только > своего потока, потому одинаковые числа и выводило. Так что > srandнужновызывать в каждом потоке. Причём иного пути, > как мне кажется, нет, и быть не может. > > Вообще-то комбинируя неправильные действия (например, как у > тебя: выбрав однопоточное приложение) можно добиться > правильного внешнего результата, но это не правильно и > обязательно скажется потом. > > И последнее: купи книгу Рихтера и не мучайся - там всё это > описано.
У меня третье издание. Пример bucket.c: srand вообще не вызывается(?)
Всем спасибо. Что-то и раньше мне подсказывало не использовать стандартные библиотеки :)
Ну тогда хелп ми крутые мужики!20.05.01 10:50 Автор: :-) <:-)> Статус: Elderman
> > Потоки надо создавать не с помощью CreateThread, а > > _beginthreadex > > :)) > Это решает проблему или просто позволяет улыбнуться?
В данном случае - очень вряд ли. Лично у меня в single-threaded приведенный код честно выдал 20 разных чисел и так, что, в принципе, вполне объяснимо.
Все эти single-threaded, multi-threaded важны исключительно для функций из стандартной библиотеки, которые используют какие-то переменные для хранения промежуточных результатов. Берем ту же пару srand/rand. Srand инициализирует генератор псевдослучайных чисел, полученное значение надо где-то сохранить. В случае использования multithreaded и _beginthreadex для каждого потока все эти глобальные переменные будут своими. Т.е. srand, выполненный в главном потоке, не будет иметь никакого отношения к randам из дочерних потоков, и все они просто запустятся непроинициализированными (есть еще шанс, что дочерние потоки унаследуют значения глобальных библиотечных переменных от родительского, но зуб не дам, надо смотреть). CreateThread весь этот механизм обходит стороной, и в результате в сочетании с single-threaded все должно работать, как задумано.
Но вообще, гораздо корректнее было бы инициализировать srand в каждом потоке, отталкиваясь от идентификатора потока и времени.