什么时候打电话给CloseHandle?

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.

但在这种情况下我该怎么办?

[我想这个问题对所有操作系统都有用,所以也要标记它们.]

Dam*_*mon 5

如果你真的不在乎等待线程,你可以在创建线程后立即关闭句柄.

但是,我强烈反对这样做.你应该总是等待线程退出(最好以干净,明确的方式).如果没有提前完成,请等待程序退出时生成的每个线程.总是,没有例外.
不要不main知道其他一些线程是否仍在运行.如果需要的话,以艰难的方式杀死它们(虽然最好让它们以受控的方式优雅地退出,并等待它).

如果您等待线程完成,您可能会看到奇怪的崩溃退出条件.更糟的是,你可能不会看到他们的,只有让用户/客户抱怨,在一个百倍的配置文件被破坏(或更糟的是,他们的数据文件)1.现在想象一下,他们能够逐步展示他们正在做的事情,你可以告诉他们他们正确地做了一切,并且没有办法出错.
祝你好运,发现崩溃是由于仍然在运行的工作线程访问某个对象(或全局状态),该对象刚刚由CRT明确或隐含地由现有的主线程解除分配.

当然,你的立场可能是工作线程在程序完成之前很久就会退出,所以为什么要这么麻烦.然而,那就是玩俄罗斯轮盘赌.


1这不是虚构,而是我以前见过的事情.