_beginthreadex vs CreateThread
От: McQwerty Россия  
Дата: 25.10.01 09:30
Оценка:
Возможно-ли использование CreateThread вместо _beginthreadex если
используется версия библиотеки "Multithreaded DLL" а не "Multithreaded"?

MS VC 6.
Re: _beginthreadex vs CreateThread
От: Snax Россия  
Дата: 01.11.01 06:23
Оценка: 4 (1)
Здравствуйте McQwerty, Вы писали:

MQ>Возможно-ли использование CreateThread вместо _beginthreadex если

MQ>используется версия библиотеки "Multithreaded DLL" а не "Multithreaded"?

Это больше зависит от того, что Вы собираетесь использовать в этой нитке.
Если только вызовы Win32 API, хватит и CreateThread. Если же
CTR-шные функции, требующие спец. инициализации нитки или подчистки на
выходе, то beginthreadex.

смотрите Q104641

Павел.
Re[2]: _beginthreadex vs CreateThread
От: Vodka  
Дата: 01.11.01 07:47
Оценка:
Здравствуйте Snax, Вы писали:

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


MQ>>Возможно-ли использование CreateThread вместо _beginthreadex если

MQ>>используется версия библиотеки "Multithreaded DLL" а не "Multithreaded"?

S>Это больше зависит от того, что Вы собираетесь использовать в этой нитке.

S>Если только вызовы Win32 API, хватит и CreateThread. Если же
S>CTR-шные функции, требующие спец. инициализации нитки или подчистки на
S>выходе, то beginthreadex.

S>смотрите Q104641


S>Павел.


Я конечно исходники не смотрел, но возможно Multithreaded DLL перехватывает момент создания потока (через DllMain) и возможно неявно всё инициализирует. Но это надо глянуть в исходники.
Re: _beginthreadex vs CreateThread
От: McQwerty Россия  
Дата: 12.11.01 09:06
Оценка: 35 (2)
Здравствуйте McQwerty, Вы писали:

MQ>Возможно-ли использование CreateThread вместо _beginthreadex если

MQ>используется версия библиотеки "Multithreaded DLL" а не "Multithreaded"?

MQ>MS VC 6.


Исследовал этот вопрос окончательно. :)
При использовании ключа /MD "Multithreaded DLL" можно безболезненно
использовать CreateThread вместо _beginthread[ex].

Первый же вызов RTL-функции, использующий потоко-зависимые
данные приводит к вызову _getptd которая при отсутствии
значения в TLS аллокирует блок данных потока (TIDTABLE.C):

[vc]
if ( (ptd = TlsGetValue(__tlsindex)) == NULL ) {
/*
* no per-thread data structure for this thread. try to create
* one.
*/
if ( ((ptd = _calloc_crt(1, sizeof(struct _tiddata))) != NULL) &&
TlsSetValue(__tlsindex, (LPVOID)ptd) ) {

/*
* Initialize of per-thread data
*/

_initptd(ptd);

ptd->_tid = GetCurrentThreadId();

ptd->_thandle = (unsigned long)(-1L);
}
else
_amsg_exit(_RT_THREAD); /* write message and die */
}
[/vc]

Это в точности то, что делает _beginthreadex (THREADEX.C):
[vc]
/*
* Allocate and initialize a per-thread data structure for the to-
* be-created thread.
*/
if ( (ptd = _calloc_crt(1, sizeof(struct _tiddata))) == NULL )
goto error_return;

/*
* Initialize the per-thread data
*/

_initptd(ptd);

ptd->_initaddr = (void *) initialcode;

ptd->_initarg = argument;
ptd->_thandle = (unsigned long)(-1L);
[/vc]

освобождение выделенной памяти происходит в функции _CRT_INIT (DLLCRT0.C):
[vc]
#ifdef _MT
else if ( dwReason == DLL_THREAD_DETACH )
{
_freeptd(NULL); /* free up per-thread CRT data */
}
#endif /* _MT */
[/vc]

что соответствует коду из _endthreadex (THREADEX.C)
[vc]
if ( (ptd = _getptd()) == NULL )
_amsg_exit(_RT_THREAD);

/*
* Free up the _tiddata structure & its subordinate buffers
* _freeptd() will also clear the value for this thread
* of the TLS variable __tlsindex.
*/
_freeptd(ptd);
[/vc]

Обращать внимания на NULL в вызове _freeptd при DLL_THREAD_DETACH не нужно, поскольку (TIDTABLE.C):
[vc]
/***
*void _freeptd(_ptiddata) — free up a per-thread data structure
*
*Purpose:
* Called from _endthread and from a DLL thread detach handler,
* this routine frees up the per-thread buffer associated with a
* thread that is going away. The tiddata structure itself is
* freed, but not until its subordinate buffers are freed.
*
*Entry:
* pointer to a per-thread data block (malloc-ed memory)
* If NULL, the pointer for the current thread is fetched.
*
*Exit:
*
*Exceptions:
*
**************************************************************/
[/vc]

Вроде все на эту тему. Для меня вопрос закрыт.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.