_beginthreadex() vs CreateThread()
От: maks1180  
Дата: 17.11.08 01:21
Оценка:
Чем опасно использования CreateThread() ?
в MSDN рекомендуют использовать _beginthreadex()
===============================================
(реклама, удалена модератором)
Re: _beginthreadex() vs CreateThread()
От: Pavel Dvorkin Россия  
Дата: 17.11.08 02:52
Оценка:
Здравствуйте, maks1180, Вы писали:

M>Чем опасно использования CreateThread() ?

M>в MSDN рекомендуют использовать _beginthreadex()

Тем, что ты не поставишь в известность RTL C++ о появлении нового потока. А ей об этом надо знать. _beginthreadex — функция RTL C++, а CreateThread — Win32.
With best regards
Pavel Dvorkin
Re: _beginthreadex() vs CreateThread()
От: adontz Грузия http://adontz.wordpress.com/
Дата: 17.11.08 05:00
Оценка:
Здравствуйте, maks1180, Вы писали:

_beginthreadex() создаёт для потока инфраструктуру обработки Си++ исключений. АФАИК если исключений нет, то по фиг.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: _beginthreadex() vs CreateThread()
От: Аноним  
Дата: 17.11.08 11:30
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, maks1180, Вы писали:


A>_beginthreadex() создаёт для потока инфраструктуру обработки Си++ исключений. АФАИК если исключений нет, то по фиг.


Странно, но я ипользовал конструкции

throw new CMyException() и
try {

}
catch(CMyException* ex) {

}

и в потоке созданном CreateThread(), все работало нормально.

Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный...
Re[3]: _beginthreadex() vs CreateThread()
От: Were  
Дата: 17.11.08 12:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Странно, но я ипользовал конструкции

_beginthreadex инициализирует PTD (per-thread data), которая используется многими CRT функциями и запускает свой thread start routine, вместо указанного тобой. После завершения твоей функции, CRT вызывает _endthreadex, которая подчищает PTD.

А>и в потоке созданном CreateThread(), все работало нормально.

Будут утечки, при использовании CRT функций, так как PTD будет инициализирована при первом использовании, но уничтожать выделенную память уже будет некому.

А>Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный...

Не закрывает и даже не хранит. Закрывать его нужно самостоятельно, когда он уже не нужен.
Re[4]: _beginthreadex() vs CreateThread()
От: McQwerty Россия  
Дата: 17.11.08 13:04
Оценка:
Здравствуйте, 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, малоли
можно еще про борланд вспомниить...
Re[5]: _beginthreadex() vs CreateThread()
От: Were  
Дата: 17.11.08 14:38
Оценка:
Здравствуйте, 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, чего и Вам желаю. Не зависеть от настроек проекта — это так удобно )


так /МТ или /MD — это разные вещи ???
Re[4]: _beginthreadex() vs CreateThread()
От: maks1180  
Дата: 19.11.08 16:12
Оценка:
А>>Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный...
W>Не закрывает и даже не хранит. Закрывать его нужно самостоятельно, когда он уже не нужен.

_beginthread[ex]() — может не возвратить Хэндл, как его получить ?
===============================================
(реклама, удалена модератором)
Re[5]: _beginthreadex() vs CreateThread()
От: Were  
Дата: 19.11.08 16:23
Оценка:
Здравствуйте, maks1180, Вы писали:

А>>>Если я использую _beginthreadex(), по окончании работы созданного потока С++ закрывает на него Handle, я мне нужно будет подождать пока он закончит работу, как мне это сделать ? Ведь если он раньше закончит, чем я вызову WaitForSingleObject() то Handle будет не валидный...

W>>Не закрывает и даже не хранит. Закрывать его нужно самостоятельно, когда он уже не нужен.

M>_beginthread[ex]() — может не возвратить Хэндл, как его получить ?


_beginthreadex всегда возвращает либо хэндл, либо 0 в случае ошибки (в этом случае выставляется errno). _beginthread может работать очень непредсказуемо, так что использовать ее не советую.
Re[7]: _beginthreadex() vs CreateThread()
От: Were  
Дата: 19.11.08 16:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>так /МТ или /MD — это разные вещи ???

А что, MSDN доступен только избранным?
Re[6]: _beginthreadex() vs CreateThread()
От: Аноним  
Дата: 20.11.08 13:19
Оценка:
W>_beginthreadex всегда возвращает либо хэндл, либо 0 в случае ошибки (в этом случае выставляется errno). _beginthread может работать очень непредсказуемо, так что использовать ее не советую.
_beginthread работает вполне предсказуемо. Просто возвращаемое ею значение нелья использовать для чего либо кроме сравнения с нулем.
Re[7]: _beginthreadex() vs CreateThread()
От: Were  
Дата: 20.11.08 13:50
Оценка:
Здравствуйте, Аноним, Вы писали:

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.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.