Здравствуйте, maks1180, Вы писали:
M>Чем опасно использования CreateThread() ? M>в MSDN рекомендуют использовать _beginthreadex()
Тем, что ты не поставишь в известность RTL C++ о появлении нового потока. А ей об этом надо знать. _beginthreadex — функция RTL C++, а CreateThread — Win32.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, maks1180, Вы писали:
A>_beginthreadex() создаёт для потока инфраструктуру обработки Си++ исключений. АФАИК если исключений нет, то по фиг.
Странно, но я ипользовал конструкции
throw new CMyException() и
try {
}
catch(CMyException* ex) {
}
и в потоке созданном CreateThread(), все работало нормально.
Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный...
Здравствуйте, Аноним, Вы писали:
А>Странно, но я ипользовал конструкции
_beginthreadex инициализирует PTD (per-thread data), которая используется многими CRT функциями и запускает свой thread start routine, вместо указанного тобой. После завершения твоей функции, CRT вызывает _endthreadex, которая подчищает PTD.
А>и в потоке созданном CreateThread(), все работало нормально.
Будут утечки, при использовании CRT функций, так как PTD будет инициализирована при первом использовании, но уничтожать выделенную память уже будет некому.
А>Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный...
Не закрывает и даже не хранит. Закрывать его нужно самостоятельно, когда он уже не нужен.
Здравствуйте, Were, Вы писали:
А>>Странно, но я ипользовал конструкции W>_beginthreadex инициализирует PTD (per-thread data), которая используется многими CRT функциями и запускает свой thread start routine, вместо указанного тобой. После завершения твоей функции, CRT вызывает _endthreadex, которая подчищает PTD.
А>>и в потоке созданном CreateThread(), все работало нормально. W>Будут утечки, при использовании CRT функций, так как PTD будет инициализирована при первом использовании, но уничтожать выделенную память уже будет некому.
А>>Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный... W>Не закрывает и даже не хранит. Закрывать его нужно самостоятельно, когда он уже не нужен.
Утечек не будет. Этот вопрос я исследовал здесь в 2001 году.
Re[5]: _beginthreadex() vs CreateThread()
От:
Аноним
Дата:
17.11.08 13:12
Оценка:
MQ>Утечек не будет. Этот вопрос я исследовал здесь в 2001 году.
исследуйте тогда еще студии 2003, 2005, 2008 ибо у них всех разные CRT
а так же исследуйте реализацию потоков в mingw, малоли
можно еще про борланд вспомниить...
Здравствуйте, McQwerty, Вы писали:
MQ>Утечек не будет. Этот вопрос я исследовал здесь в 2001 году.
Цитата:
Исследовал этот вопрос окончательно.
При использовании ключа /MD "Multithreaded DLL" можно безболезненно
использовать CreateThread вместо _beginthread[ex].
Я использую /MT и не использую CreateThread, чего и Вам желаю. Не зависеть от настроек проекта — это так удобно )
Re[6]: _beginthreadex() vs CreateThread()
От:
Аноним
Дата:
19.11.08 16:09
Оценка:
Здравствуйте, Were, Вы писали:
W>Цитата: W>
W>Исследовал этот вопрос окончательно.
W>При использовании ключа /MD "Multithreaded DLL" можно безболезненно
W>использовать CreateThread вместо _beginthread[ex].
W>Я использую /MT и не использую CreateThread, чего и Вам желаю. Не зависеть от настроек проекта — это так удобно )
А>>Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный... W>Не закрывает и даже не хранит. Закрывать его нужно самостоятельно, когда он уже не нужен.
_beginthread[ex]() — может не возвратить Хэндл, как его получить ?
Здравствуйте, maks1180, Вы писали:
А>>>Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный... W>>Не закрывает и даже не хранит. Закрывать его нужно самостоятельно, когда он уже не нужен.
M>_beginthread[ex]() — может не возвратить Хэндл, как его получить ?
_beginthreadex всегда возвращает либо хэндл, либо 0 в случае ошибки (в этом случае выставляется errno). _beginthread может работать очень непредсказуемо, так что использовать ее не советую.
Здравствуйте, Аноним, Вы писали:
А>так /МТ или /MD — это разные вещи ???
А что, MSDN доступен только избранным?
Re[6]: _beginthreadex() vs CreateThread()
От:
Аноним
Дата:
20.11.08 13:19
Оценка:
W>_beginthreadex всегда возвращает либо хэндл, либо 0 в случае ошибки (в этом случае выставляется errno). _beginthread может работать очень непредсказуемо, так что использовать ее не советую.
_beginthread работает вполне предсказуемо. Просто возвращаемое ею значение нелья использовать для чего либо кроме сравнения с нулем.
Здравствуйте, Аноним, Вы писали:
W>>_beginthreadex всегда возвращает либо хэндл, либо 0 в случае ошибки (в этом случае выставляется errno). _beginthread может работать очень непредсказуемо, так что использовать ее не советую. А>_beginthread работает вполне предсказуемо. Просто возвращаемое ею значение нелья использовать для чего либо кроме сравнения с нулем.
Вы только что привели еще один пример непредсказуемой работы )
Для справки:
_beginthread returns 1L on an error, in which case errno is set to EAGAIN if there are too many threads or to EINVAL if the argument is invalid or the stack size is incorrect.