Я думаю, что делаю простую ошибку, но поскольку я заметил, что здесь много экспертов по повышению, я думал, что попрошу о помощи.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. Что я недопонимаю?
Вы должны определить возвращаемое значение 'void *' для 'network_start'. – Potatoswatter
Почему void *? Я хотел иметь пустоту там и отредактировал ее. Я изменился на void *, хотя это и не решило проблему. –
Я думал о pthreads, которые требуют 'void *'. 'void' работает для повышения потоков, так что это хорошо. – Potatoswatter