使用 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 在挂起模式下创建线程的主要内容,如果未能解决你的问题,请参考以下文章