ale*_*gle 14 c c++ multithreading
Windows和Solaris线程API都允许以"挂起"状态创建线程.线程实际上只在以后"恢复"时启动.我已经习惯了没有这个概念的POSIX线程,而且我很难理解它的动机.任何人都可以建议为什么创建一个"暂停"线程会有用吗?
这是一个简单的说明性示例.WinAPI允许我这样做:
t = CreateThread(NULL,0,func,NULL,CREATE_SUSPENDED,NULL);
// A. Thread not running, so do... something here?
ResumeThread(t);
// B. Thread running, so do something else.
Run Code Online (Sandbox Code Playgroud)
(简单的)POSIX等价似乎是:
// A. Thread not running, so do... something here?
pthread_create(&t,NULL,func,NULL);
// B. Thread running, so do something else.
Run Code Online (Sandbox Code Playgroud)
有没有人有任何现实世界的例子,他们能够在A点(在CreateThread和ResumeThread之间)做一些事情,这在POSIX上会很困难?
小智 9
在许多实例中创建一个处于挂起状态的线程是很有用的(我发现) - 你可能希望得到线程的句柄并设置它的一些属性,然后再允许它开始使用你设置的资源它.
暂停开始比启动它更安全然后暂停它 - 你不知道它有多远或它正在做什么.
另一个示例可能是当您想要使用线程池时 - 您预先创建必要的线程,暂停,然后在请求进入时,选择其中一个线程,设置任务的线程信息,然后设置它可调度的.
我敢说有些方法没有CREATE_SUSPENDED,但它肯定有它的用途.
如果你想要很多细节,可以在'通过C/C++的Windows'(Richter/Nasarre)中使用一些例子!
CreateThread 中有一个隐含的竞争条件:在线程开始运行之前,您无法获取线程 ID 。调用返回时完全不可预测,因为您知道线程可能已经完成。如果线程在需要 TID 的进程的其余部分中引起任何交互,那么您就有问题了。
如果 API 不支持启动挂起线程,这不是一个无法解决的问题,只需立即将线程块放在互斥锁上并在 CreateThread 调用返回后释放该互斥锁。
然而,有Windows API中的另外一种用法CREATE_SUSPENDED这是非常难以对付,如果API的支持不足。CreateProcess() 调用也接受这个标志,它挂起进程的启动线程。机制是相同的,进程被加载,你会得到一个 PID,但在你释放启动线程之前不会运行任何代码。这非常有用,我已经使用此功能设置了一个进程防护,用于检测进程故障并创建小型转储。CREATE_SUSPEND 标志允许我检测和处理初始化失败,通常很难排除故障。