информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медГде водятся OGRыЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Ну тогда хелп ми крутые мужики! 20.05.01 07:26  Число просмотров: 733
Автор: я Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Этот код при установке 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;
}
<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 в каждом потоке, отталкиваясь от идентификатора потока и времени.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach