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

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

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

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

【问题讨论】:

    标签: c linux winapi pthreads


    【解决方案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_create 之后绑定。
    • @MetallicPriest:我已经写了自己的答案,请检查您的反对意见。
    【解决方案3】:

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

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

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

    【讨论】:

    • 至少,我们可以在 pthread_create 时将它绑定到一个核心吗?顺便说一句,我讨厌那个条件变量方法挂起,效率太低了!
    • 你正在寻找这个function
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2012-04-13
    相关资源
    最近更新 更多