哪个线程以多线程结束
Which thread finishes with multithreading?
我刚来这里,希望我做的每件事都很好。
我想知道如何在等待一个线程使用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);
它最多只能同时运行三个线程。因此,我有一个循环来开始所有三个线程(因此循环值)。问题是,当我再次遍历它时,我想将循环的值更改为刚刚完成任务的线程的值,以便再次使用它。有没有办法找出数组中的哪个线程已经完成了?
我会粘贴其余的代码,但我敢肯定没有人需要全部147行。我想这个片段就足够了。
当第三个参数是false
时,一旦有任何对象发出信号,WaitForMultipleObjects
就会返回(不需要等待所有对象)。
返回值指示是哪个对象导致它返回。第一个对象将为WAIT_OBJECT_0
,第二个对象为WAIT_OBJECT_0 + 1
,依此类推。
我离开了我的编译器,我不知道有什么能与windows一起工作的online 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;
}
在工作中,我们的做法有点不同。我们制作了一个库,它封装了所有需要的窗口句柄类型和预成型静态类型检查(通过转换运算符),以确保您不能等待IOCompletionPort
和WaitForMultipleObjects
(这是不允许的)。等待函数是可变的,而不是采用句柄及其大小的数组,并且当只有一个句柄时,使用SFINAE专门使用WaitForSingleObject
。它还将Lambdas作为自变量,并根据发出信号的事件执行相应的自变量。
这就是它的样子:
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;});
我强烈推荐这种类型的包装,因为在一天结束时,编译器会将其优化为相同的代码,但你不会犯那么多错误。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 使用 shared_ptr 在中断时结束多线程循环
- 哪个线程以多线程结束