Ash*_*egi 4 c++ multithreading pthreads
我有一个主线程,接收需要一些时间的操作.所以我创建一个线程并将作业委托给它.主线程在接收作业时调用此执行函数.每个作业都执行此执行.
Return_type execute( Arguments_here) {
// if a file read case
DWORD threadId;
HANDLE hThread = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyAsyncFileRead, // thread function name
details, // argument to thread function
0, // use default creation flags
&threadId); // returns the thread identifier
// else do other work
}
Run Code Online (Sandbox Code Playgroud)
现在因为我不想在主线程上等待,所以我不调用WaitForSingleObject.[我对windows线程的了解很少.所以,如果不需要,请原谅我]
如果我等待线程关闭,它将等待我的主线程.我不想那样做.那么我什么时候打电话给CloseHandle?
当一个人拥有10个工作并且一个创建10个线程然后等待所有10个线程完成时,那么wait_for_multiple_objects看起来很好,然后在每个句柄上调用CloseHandle.
但在这种情况下我该怎么办?
[我想这个问题对所有操作系统都有用,所以也要标记它们.]
如果你真的不在乎等待线程,你可以在创建线程后立即关闭句柄.
但是,我强烈反对这样做.你应该总是等待线程退出(最好以干净,明确的方式).如果没有提前完成,请等待程序退出时生成的每个线程.总是,没有例外.
不要不main知道其他一些线程是否仍在运行.如果需要的话,以艰难的方式杀死它们(虽然最好让它们以受控的方式优雅地退出,并等待它).
如果您不等待线程完成,您可能会看到奇怪的崩溃退出条件.更糟的是,你可能不会看到他们的,只有让用户/客户抱怨,在一个百倍的配置文件被破坏(或更糟的是,他们的数据文件)1.现在想象一下,他们能够逐步展示他们正在做的事情,你可以告诉他们他们正确地做了一切,并且没有办法出错.
祝你好运,发现崩溃是由于仍然在运行的工作线程访问某个对象(或全局状态),该对象刚刚由CRT明确或隐含地由现有的主线程解除分配.
当然,你的立场可能是工作线程在程序完成之前很久就会退出,所以为什么要这么麻烦.然而,那就是玩俄罗斯轮盘赌.