我正在尝试在线程中执行我的程序,我使用pthread_create()
,但它会立即运行线程。我想允许用户在运行之前更改线程优先级。如何解决?
for(int i = 0; i < threads; i++)
{
pthread_create(data->threads+i,NULL,SelectionSort,data);
sleep(1);
print(data->array);
}
答案 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<...>
的对象)以便稍后加入该线程。
请注意,提供答案不应被视为支持线程优先级:据我所知,使用线程优先级是不明智的。