Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
[C++] run-time library. Кто может объяснить по-русски 20.05.01 00:54 Число просмотров: 778
Автор: dl <Dmitry Leonov>
|
> > Single-Threaded > > Multithreaded > > Multithreaded DLL > Вибирай N2 и ни о чем не думай ... :)
А я как-то все больше с N3, правда, у нас и проекты здоровые, включающие несколько своих dll...
|
<programming>
|
[C++] run-time library. Кто может объяснить по-русски 19.05.01 11:34
Автор: я Статус: Незарегистрированный пользователь
|
Project Settings -> C/C++(Code Generation) -> Use run-time library
Объясните плиз о чем думаете, выбирая из списка:
Single-Threaded
Multithreaded
Multithreaded DLL
|
|
[C++] run-time library. Кто может объяснить по-русски 19.05.01 16:50
Автор: XR <eXtremal Research> Статус: The Elderman
|
> Project Settings -> C/C++(Code Generation) -> Use > run-time library > Объясните плиз о чем думаете, выбирая из списка:
> Single-Threaded > Multithreaded > Multithreaded DLL
Вибирай N2 и ни о чем не думай ... :)
|
| |
[C++] run-time library. Кто может объяснить по-русски 20.05.01 00:54
Автор: dl <Dmitry Leonov>
|
> > Single-Threaded > > Multithreaded > > Multithreaded DLL > Вибирай N2 и ни о чем не думай ... :)
А я как-то все больше с N3, правда, у нас и проекты здоровые, включающие несколько своих dll...
|
| | |
Ну тогда хелп ми крутые мужики! 20.05.01 07:26
Автор: я Статус: Незарегистрированный пользователь
|
Этот код при установке Multithreaded(Release) распечатывает одно и то же число. Single-Threaded не намного лучше :(
Если закрыть rand() критической секцией, то Multithreaded без эмоций ваще, а Single - что-то вроде...
#include <windows.h>
#include <stdio.h>
#include <time.h>
DWORD WINAPI ThreadProc(void *dummy)
{
printf("%d\r\n", rand());
return(0);
}
int main()
{
HANDLE *Threads;
DWORD i, ThreadID, NumThreads=20;
srand((unsigned)time(NULL));
Threads=new HANDLE[NumThreads];
for(i=0; i<NumThreads; i++)
{
Threads[i]=CreateThread(NULL, 0, ThreadProc, 0, 0, &ThreadID);
}
WaitForMultipleObjects(NumThreads, Threads, true, INFINITE);
delete[] Threads;
return 0;
}
|
| | | |
Ну тогда хелп ми крутые мужики! 21.05.01 00:09
Автор: Бяша <Biasha> Статус: Member
|
Ну во-первыхникогдане вызывай из 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
:))
|
| | | | |
Ну тогда хелп ми крутые мужики! 20.05.01 11:37
Автор: я Статус: Незарегистрированный пользователь
|
> Потоки надо создавать не с помощью CreateThread, а > _beginthreadex > :)) >
Это решает проблему или просто позволяет улыбнуться?
|
| | | | | |
Ну тогда хелп ми крутые мужики! 20.05.01 12:07
Автор: dl <Dmitry Leonov> Отредактировано 20.05.01 12:08 Количество правок: 1
|
> > Потоки надо создавать не с помощью CreateThread, а > > _beginthreadex > > :)) > Это решает проблему или просто позволяет улыбнуться?
В данном случае - очень вряд ли. Лично у меня в single-threaded приведенный код честно выдал 20 разных чисел и так, что, в принципе, вполне объяснимо.
Все эти single-threaded, multi-threaded важны исключительно для функций из стандартной библиотеки, которые используют какие-то переменные для хранения промежуточных результатов. Берем ту же пару srand/rand. Srand инициализирует генератор псевдослучайных чисел, полученное значение надо где-то сохранить. В случае использования multithreaded и _beginthreadex для каждого потока все эти глобальные переменные будут своими. Т.е. srand, выполненный в главном потоке, не будет иметь никакого отношения к randам из дочерних потоков, и все они просто запустятся непроинициализированными (есть еще шанс, что дочерние потоки унаследуют значения глобальных библиотечных переменных от родительского, но зуб не дам, надо смотреть). CreateThread весь этот механизм обходит стороной, и в результате в сочетании с single-threaded все должно работать, как задумано.
Но вообще, гораздо корректнее было бы инициализировать srand в каждом потоке, отталкиваясь от идентификатора потока и времени.
|
|
|