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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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