2010-04-08 4 views
2

Я думаю, что делаю простую ошибку, но поскольку я заметил, что здесь много экспертов по повышению, я думал, что попрошу о помощи.Boost Thread Hanging on _endthreadex

Я пытаюсь использовать форсированные потоки (1_40) на окнах xp. Основная программа загружает dll, запускает такой поток (обратите внимание, что это не относится к классу, статичность не означает статичность для класса, а закрыта для файла).

static boost::thread network_thread; 
static bool quit = false; 
HANDLE quitEvent; 

//some code omitted for clarity, ask if you think it would help 
void network_start() 
{ 
    HANDLE *waitHandles = (HANDLE*)malloc(3 * sizeof(HANDLE)); 
    waitHandles[0] = quitEvent; 
    waitHandles[1] = recvEvent; 
    waitHandles[2] = pendingEvent; 
    do { 
     //read network stuff, or quit event 
     dwEvents =WaitForMultipleObjects(3, waitHandles, FALSE, timeout); 
    } while (!quit) 
} 

DllClass::InitInstance() 
{ 
} 

DllClass::ExportedFunction() 
{ 
    network_thread = boost::thread(boost::bind<void>(network_start)); 
} 


DllClass::ExitInstance() 
{ 
    //signal quit (which works) 
    quit = true; 
    SetEvent(QuitEvent); 
    //the following code is slightly verbose because I'm trying to figure out what's wrong 
    try { 
     if (network_thread.joinable()) { 
      network_thread.join(); 
     } else { 
      TRACE("Too late!"); 
     } 
    } catch (boost::thread_interrupted&) { 
     TRACE("NET INTERRUPTED"); 
    } 
} 

Проблема заключается в том, что основной поток висит на соединение, а сеть нить висит в конце _endthreadex. Что я недопонимаю?

+0

Вы должны определить возвращаемое значение 'void *' для 'network_start'. – Potatoswatter

+0

Почему void *? Я хотел иметь пустоту там и отредактировал ее. Я изменился на void *, хотя это и не решило проблему. –

+0

Я думал о pthreads, которые требуют 'void *'. 'void' работает для повышения потоков, так что это хорошо. – Potatoswatter

ответ

3

Вы не должны создавать/концевые нити в InitInstance/ExitInstance,

см http://support.microsoft.com/default.aspx?scid=kb;EN-US;142243 для получения дополнительной информации. Также см. http://msdn.microsoft.com/en-us/library/ms682583%28VS.85%29.aspx о DllMain в целом.

+0

Ну, я должен быть более ясным в том, что поток не СОЗДАНО в InitInstance, но я пытаюсь уничтожить его из ExitInstance. Вероятно, это источник проблемы, я буду исследовать, спасибо. –

+0

В этом была проблема. Больная часть состоит в том, что коллега, который действительно знает MFC, даже поместил метод «уничтожить» в интерфейс ... меня. –