为什么我要启动一个"暂停"的线程?

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上会很困难?

adf*_*f88 22

  1. 要预先分配资源,然后几乎立即启动线程.
  2. 您有一种重用线程的机制(恢复它),但您实际上没有要重用的线程,您必须创建一个.


小智 9

在许多实例中创建一个处于挂起状态的线程是很有用的(我发现) - 你可能希望得到线程的句柄并设置它的一些属性,然后再允许它开始使用你设置的资源它.

暂停开始比启动它更安全然后暂停它 - 你不知道它有多远或它正在做什么.

另一个示例可能是当您想要使用线程池时 - 您预先创建必要的线程,暂停,然后在请求进入时,选择其中一个线程,设置任务的线程信息,然后设置它可调度的.

我敢说有些方法没有CREATE_SUSPENDED,但它肯定有它的用途.

如果你想要很多细节,可以在'通过C/C++的Windows'(Richter/Nasarre)中使用一些例子!


Han*_*ant 5

CreateThread 中有一个隐含的竞争条件:在线程开始运行之前您无法获取线程 ID 。调用返回时完全不可预测,因为您知道线程可能已经完成。如果线程在需要 TID 的进程的其余部分中引起任何交互,那么您就有问题了。

如果 API 不支持启动挂起线程,这不是一个无法解决的问题,只需立即将线程块放在互斥锁上并在 CreateThread 调用返回后释放该互斥锁。

然而,有Windows API中的另外一种用法CREATE_SUSPENDED这非常难以对付,如果API的支持不足。CreateProcess() 调用也接受这个标志,它挂起进程的启动线程。机制是相同的,进程被加载,你会得到一个 PID,但在你释放启动线程之前不会运行任何代码。这非常有用,我已经使用此功能设置了一个进程防护,用于检测进程故障并创建小型转储。CREATE_SUSPEND 标志允许我检测和处理初始化失败,通常很难排除故障。

  • 嗯,它也是在 CreateThread 中通过引用设置的。不确定首先是什么鸡。 (2认同)