При рассмотрении того, является ли функция реентерабельной или нет, пример должен быть немного менее тривиальным, чем этот.
pDNM DNMManager_New(void) //reentrant?
{
return &DNMTemp;
}
Но ссылка на DNMTemp
(его адрес) останется неизменной во время выполнения программы, поэтому эта функция реентерабельна.
Но если вы получите доступ к реальным данным, это не так.
uint32_t DNMManager_read(void) //reentrant?
{
return SerialNum;
}
Для неуправляемых процессов Вы управляете моделью квартиры, используемой для потока передающими соответствующими параметрами к CoInitializeEx()
. Larry Osterman описал замечательное маленькое руководство по ним:
...
Когда поток звонитCoInitializeEx
(илиCoInitialize
), поток говорит COM, которую из двух типов квартиры он готов разместить. Чтобы указать, что поток должен жить в MTA, Вы передаетеCOINIT_MULTITHREADED
флаг кCoInitializeEx
. Указать, что поток должен разместить STA, любой вызовCoInitialize
или передачаCOINIT_APARTMENTTHREADED
флаг кCoInitializeEx
.
...
-- http://blogs.msdn.com/larryosterman/archive/2004/04/28/122240.aspx
C++ не имеет созданным в поддержке потока. То, что Вы ищете, зависит от того, как Вы реализуете потоки в своем приложении. Win32? pthreads? повышение:: потоки? Какой бы ни API, который Вы используете, определит ответ на Ваш вопрос.
Править: похож это может иметь пример для Вас: http://msdn.microsoft.com/en-us/library/system.threading.apartmentstate.aspx
Похоже, что это относится к управляемому C++.