2016-12-28 10 views
1

Я пытаюсь написать несколько ядер для создания PTHREAD с SCHED_RR:создания темы с использованием pthread_create с планированием SCHED_RR терпит неудачу

pthread_attr_t attr; 
pthread_attr_init(&attr); 
pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED); 
pthread_attr_setschedpolicy(&attr, SCHED_RR); 
struct sched_param params; 
params.sched_priority = 10; 
pthread_attr_setschedparam(&attr, &params); 
pthread_create(&m_thread, &attr, &startThread, NULL); 
pthread_attr_destroy(&attr); 

Но нить does't бежать, мне нужно установить несколько параметров?

ответ

0

Поток может установить только SCHED_OTHER без возможности использования CAP_SYS_NICE. От sched(7):

In Linux kernels before 2.6.12, only privileged (CAP_SYS_NICE) 
    threads can set a nonzero static priority (i.e., set a real-time 
    scheduling policy). The only change that an unprivileged thread can 
    make is to set the SCHED_OTHER policy, and this can be done only if 
    the effective user ID of the caller matches the real or effective 
    user ID of the target thread (i.e., the thread specified by pid) 
    whose policy is being changed. 

Это означает, что при установке политики планирования для планирования круговом (SCHED_RR), используя pthread_attr_setschedpolicy() это не удалось, по всей вероятности (если вы не включили эту возможность для пользователя вы работаете в качестве или запускающего как пользователь sysadmin/root, который может переопределить CAP_SYS_NICE).

Вы можете установить возможность использования программы setcap:

$ sudo setcap cap_sys_nice=+ep ./a.out 

(при условии, a.out ваше имя программы).

Вы бы поняли это, если вы проверили ошибку. Вы должны проверить возвращаемое значение всех функций pthread (и вообще всех функций библиотеки) для отказа.

Поскольку вы не разместил полный код, это может быть проблемой, если вы еще не присоединились к с резьбой вы создаете (как основной нить может выйти до m_thread был создан, и этот выход в целом обработать). Таким образом, вы можете присоединиться:

pthread_join(m_thread, NULL); 

или вы могли бы выйти из основного потока без присоединившиеся если основной поток больше не нужен, используя pthread_exit(NULL); в основной().