C++ 哪个线程以多线程结束?

C++ 哪个线程以多线程结束?,c++,multithreading,C++,Multithreading,我是新来这里的,我希望我做的每件事都是正确的 我想知道在使用WaitForMultipleObjects命令等待一个线程完成后,如何找出哪个线程完成。目前,我有以下几点: int checknum; int loop = 0; const int NumThreads = 3; HANDLE threads[NumThreads]; WaitForMultipleObjects(NumThreads, threads, false, INFINITE); threads[loop] = Cr

我是新来这里的,我希望我做的每件事都是正确的

我想知道在使用WaitForMultipleObjects命令等待一个线程完成后,如何找出哪个线程完成。目前,我有以下几点:

int checknum;
int loop = 0;
const int NumThreads = 3;

HANDLE threads[NumThreads];

WaitForMultipleObjects(NumThreads, threads, false, INFINITE);
threads[loop] = CreateThread(0, 0, ThreadFunction, &checknum, 0, 0);
它最多只能同时运行三个线程。因此,我有一个循环来开始所有三个线程(因此循环值)。问题是,当我再次检查它时,我想将loop的值更改为刚刚完成任务的线程的值,以便可以再次使用它。有没有办法找出该数组中的哪个线程已完成


我会粘贴其余的代码,但我很确定没有人需要全部147行代码。我想这段代码就足够了。

当第三个参数为
false
时,
WaitForMultipleObjects
将在通知任何对象后立即返回(不需要等待所有对象)


返回值指示是哪个对象导致它返回。第一个对象将是
WAIT\u OBJECT\u 0
,第二个对象将是
WAIT\u OBJECT\u 0+1
,等等。

我远离我的编译器,我不知道有一个可以与windows一起工作的onlione IDE,但这里是您需要做的大致想法

const int NumThreads = 3;
HANDLE threads[NumThreads];
//create threads here
DWORD result = WaitForMultipleObjects(NumThreads, threads, false, INFINITE);
if(result >= WAIT_OBJECT_0 && result - WAIT_OBJECT_0 < NumThreads){
    int index = result - WAIT_OBJECT_0;
    if(!CloseHandle(Handles[index])){ //need to close to give handle back to system even though the thread has finished 
        DWORD error = GetLastError();
        //TODO handle error
    }
    threads[index] = CreateThread(0, 0, ThreadFunction, &checknum, 0, 0);
}
else {
    DWORD error = GetLastError();
    //TODO handle error
    break;
}

我强烈推荐这种类型的包装,因为在一天结束时,编译器会将其优化为相同的代码,但您不会犯同样多的错误

我只需要清理一个线程就可以重新使用它。如何将WAIT_对象转换为0、1或2,这样我就可以使循环值等于该值,这样循环就可以继续。或者有没有办法检查三个线程中是否有一个是空闲的,并使用第一个可用的线程?您可以说
int index=WaitForMultipleObjects(NumThreads,threads,false,INFINITE)-WAIT\u OBJECT\u 0
,但是您确实应该检查返回值指示的其他错误。非常感谢。我只是需要一种方法来找出哪个线程完成了,这样我就可以重用它。我在线程开始之前进行错误检查,因为线程只是一个简单的数字检查器。
Win::Event ev;
Win::Thread th([]{/*...*/ return 0;});
//...

Win::WaitFor(ev,[]{std::cout << "event" << std::endl;},
        th,[]{std::cout << "thread" << std::endl;},
        std::chrono::milliseconds(100),[]{std::cout << "timeout" << std::endl;});