创建线程但不要在linux中立即运行它

时间:2017-12-13 16:53:44

标签: c++ linux multithreading unix pthreads

我正在尝试在线程中执行我的程序,我使用pthread_create(),但它会立即运行线程。我想允许用户在运行之前更改线程优先级。如何解决?

for(int i = 0; i < threads; i++)
{
   pthread_create(data->threads+i,NULL,SelectionSort,data);
   sleep(1);
   print(data->array);
}

2 个答案:

答案 0 :(得分:2)

在创建线程时设置优先级。

替换

int local_errno;

local_errno = pthread_create(..., NULL, ...);
if (local_errno != 0) { ... }

int local_errno;

pthread_attr_t attr;
local_errno = pthread_attr_init(&attr);
if (local_errno != 0) { ... }

{
    struct sched_param sp;
    local_errno = pthread_attr_getschedparam(&attr, &sp);
    if (local_errno != 0) { ... }

    sp.sched_priority = ...;

    local_errno = pthread_attr_setschedparam(&attr, &sp);
    if (local_errno != 0) { ... }
}    

/* So our scheduling priority gets used. */
local_errno = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
if (local_errno != 0) { ... }

local_errno = pthread_create(..., &attr, ...);
if (local_errno != 0) { ... }

local_errno = pthread_attr_destroy(&attr);
if (local_errno != 0) { ... }

答案 1 :(得分:1)

对于pthreads,优先级不是在创建线程后设置的,而是在创建线程时传递合适的属性:线程属性位于NULL调用中指定pthread_create()的位置。如果你想延迟线程创建,直到用户给你一个优先级,你可以创建一个期望优先级的函数对象,并在调用该函数对象时启动线程。当然,您仍然需要跟踪这样创建的对象(可能使用类似std::future<...>的对象)以便稍后加入该线程。

请注意,提供答案不应被视为支持线程优先级:据我所知,使用线程优先级是不明智的。