Gre*_*ell 10 c++ linux multithreading pthreads process
这个问题似乎可能是重复的,但我找不到一个.如果我错过了上一个问题,请道歉.
在我有大部分经验的Java中,如果你的main()分叉一个线程并立即返回进程继续运行,直到进程中的所有(非守护进程)线程都停止.
在C++中,情况似乎并非如此 - 只要主线程返回进程,其他线程仍在运行时终止.对于我当前的应用程序,这很容易通过应用程序解决,pthread_join()但我想知道是什么原因导致这种行为.这个编译器(gcc)是特定的,pthreads是特定的,还是在已经实现了C++的大多数/所有平台上共享的行为?这种行为是否可以在pthreads中配置(我在pthread_attr_*()函数中查看了pthread api,并没有看到任何看起来相关的东西.)?
完全分开的问题,但是当你在这里时......一个人会用pthread_detatch()什么?
Eva*_*ran 13
是.在现代linux(更重要的是GNU libc的更新版本)exit_group是主要返回时使用的系统调用,而不是普通的exit.exit_group描述如下:
这个系统调用等同于exit(2),除了它不仅终止调用线程,而且终止调用进程的线程组中的所有线程.
值得注意的是,当前的c ++标准没有提到线程,因此这种行为不是特定于c ++的,而是特定于您的特定实现.也就是说,当主线程终止时,我亲眼看到的每个实现都会杀死所有线程.
编辑:值得注意的是Jonathan Leffler的回答指出POSIX标准确实指定了这种行为,因此对于使用pthreads进行线程处理的应用程序来说当然是正常的.
编辑:回答有关的后续行动pthread_detach.基本上,如果您不加入非分离线程,则会将其视为资源泄漏.如果你有一个长时间运行的任务,你不需要"等待",它只是"结束时结束",那么你应该分离它,当它没有连接终止时不会有资源泄漏.手册页说明如下:
pthread_detach()函数将线程标识的线程标记为已分离.当分离的线程终止时,其资源会自动释放回系统,而不需要另一个线程与终止的线程连接.
因此,一个快速而肮脏的答案是:"当你不关心它何时结束时,将它拆开.如果另一个线程在它结束时关心并且必须等待它终止,那么就不要."
Jon*_*ler 12
该POSIX标准说:
§3.297流程终止
有两种进程终止:
当使用exit(),_ exit()或_Exit()函数请求时,从main()返回正常终止; 或者当进程中的最后一个线程通过从其start函数返回,通过调用pthread_exit()函数或通过取消终止时.
当abort()函数请求或接收到某些信号时,会发生异常终止.
适用第一个正常终止条件.(请注意,C++(1998,2003)标准没有提及线程.)
该POSIX标准(再次)说:
pthread_detach()函数应向实现指示当该线程终止时可以回收线程线程的存储.如果线程没有终止,pthread_detach()不会导致它终止.
理由说:
最终应为每个创建的线程调用pthread_join()或pthread_detach()函数,以便可以回收与该线程关联的存储.
有人建议不需要"分离"功能; detachstate线程创建属性就足够了,因为线程永远不需要动态分离.但是,至少需要两种情况:
在pthread_join()的取消处理程序中,为了分离pthread_join()等待的线程,必须有一个pthread_detach()函数.没有它,有必要让处理程序执行另一个pthread_join()来尝试分离线程,这将延迟无限期的取消处理并引入对pthread_join()的新调用,这可能本身需要取消处理程序.在这种情况下,动态分离几乎是必不可少的.
为了分离"初始线程"(在设置服务器线程的进程中可能需要).
| 归档时间: |
|
| 查看次数: |
3490 次 |
| 最近记录: |