使用 pthreads 在挂起模式下创建线程

Posted

技术标签:

【中文标题】使用 pthreads 在挂起模式下创建线程【英文标题】:Create thread in suspended mode using pthreads 【发布时间】:2011-10-31 12:48:18 【问题描述】:

在 Win32 中,您可以通过使用带有 CREATE_SUSPENDED 的 dwCreationFlags 参数来创建处于挂起模式的线程。我正在寻找与 pthreads 类似的功能。请注意,我不想在运行线程后暂停线程,然后使用条件变量将其暂停,而是实际上在暂停模式下创建它,然后稍后再启动它。

使用这种方法的好处是我可以在运行该线程之前为其分配一些属性。例如,在启动之前将其绑定到某个核心,这比先启动然后将其分配给一个核心更有效,因为它可能会从一个核心移动到另一个核心。

如果不可能,我们至少可以在调用 pthread_create 时将线程绑定到内核吗?

【问题讨论】:

【参考方案1】:

如果您想从一开始就将线程绑定到 CPU,您可以使用 pthread_create 的形式和 pthread_attr_t 参数。 Linux 支持一个特殊属性pthread_attr_setaffinity_np,它允许将线程绑定到某个 CPU 集。不要将此与需要已运行线程的pthread_setaffinity_np 混淆。

行动计划是这样的:

// create generic attribute set
pthread_attr_t attr;
pthread_attr_init(&attr);

// enhance with CPU set
pthread_attr_setaffinity_np(&attr, ...cpuset-args);

// create thread with right attributes including CPU set
pthread_t thread;
pthread_create(&thread, &attr, ...);

// viola, thread runns on given CPU-set, cleanup
pthread_attr_destroy(&attr);

【讨论】:

这个答案与原作者的问题无关。 @bkausbk 不过它解决了原作者的问题。【参考方案2】:

初始挂起状态或核心绑定将由 pthread_create 的第二个参数中给出的属性处理,选项记录在pthread_attr_init 的手册页中。我在那里没有找到相关的标志,所以目前似乎不可能。您可以针对 Linux pthreads 实现提交错误。

【讨论】:

pthread_attr_setaffinity_np() 可能有用。 pthread_attr_setaffinity_np() 只能在 pthread_create 之后绑定。 @MetallicPriest:我已经写了自己的答案,请检查您的反对意见。【参考方案3】:

pthread 属性上目前没有用于创建处于挂起状态的线程的标志。

很可能你必须在创建后手动挂起它。

关于实现挂起/恢复,可以看看here

【讨论】:

至少,我们可以在 pthread_create 时将它绑定到一个核心吗?顺便说一句,我讨厌那个条件变量方法挂起,效率太低了! 你正在寻找这个function

以上是关于使用 pthreads 在挂起模式下创建线程的主要内容,如果未能解决你的问题,请参考以下文章

已安排本地通知,但未在挂起和未运行模式下传递

MacOS 创建处于挂起状态的进程

所有 iOS 配置文件都停留在挂起 [关闭]

Thread的线程相关函数

在挂起状态下启动camunda进程

使 android Python 服务在挂起状态下运行