, , . , , . std::set<HANDLE> . Windows:
WaitForSingleObjectWaitForMultipleObjects
, . , :
std::set<HANDLE> thread_handles;
while (!thread_handles.empty()) {
std::set<HANDLE> threads_left;
for (std::set<HANDLE>::iterator cur_thread=thread_handles.begin(),
last=thread_handles.end();
cur_thread != last; ++cur_thread)
{
DWORD rc = ::WaitForSingleObject(*cur_thread, some_timeout);
if (rc == WAIT_OBJECT_0) {
::CloseHandle(*cur_thread);
} else if (rc == WAIT_TIMEOUT) {
threads_left.add(cur_thread);
} else {
::CloseHandle(*cur_thread);
}
}
std::swap(threads_left, thread_handles);
}
WaitForMultipleObjects , . ; WAIT_MAXIMUM_OBJECTS . . ;)
DWORD large_timeout = (5 * 60 * 1000);
std::set<HANDLE> thread_handles;
std::vector<HANDLE> ary;
while (!thread_handles.empty()) {
ary.assign(thread_handles.begin(), thread_handles.end());
DWORD rc = ::WaitForMultipleObjects(std::min(ary.size(), WAIT_MAXIMUM_OBJECTS),
&ary[0], FALSE, large_timeout);
if (rc == WAIT_FAILED) {
break;
} else if (rc == WAIT_TIMEOUT) {
} else {
long idx = (rc - WAIT_OBJECT_0);
if (idx > 0 && idx < ary.size()) {
thread_handles.erase(ary[idx]);
::CloseHandle(ary[idx]);
}
}
}
, . , , WaitForMultipleObjects(ary.size(), &ary[0], TRUE, INFINITE). , , , , ary.size() MAXIMUM_WAIT_OBJECTS.
, , . , . boost::thread_group.