2016-12-20 8 views
0

Я создал функцию для установки атрибутов pthread перед вызовом pthread_create(). Однако pthread_create() не работает, поскольку возвращает ненулевое значение. Я не уверен, что не так с атрибутами, установленными моей функцией. Я компилирую свою программу с g++ по адресу Ubuntu 16.04 LTS.pthreads_create() возвращает ненулевое значение?

Для компиляции и выполнения, я использую:

g++ example.cpp -lpthread 
./a.out 

-

typedef void *(*DART_TASK_T)(void *); 
typedef void (*DART_CALLBACK_T)(int); 

static struct taskcontrolblock_s sysTask[MAX_DARTOS_THREADS]; 
static unsigned max_task_id_registered = 0; 

static std :: bitset<sizeInBytes(MAX_DARTOS_THREADS)> taskIDs; 

struct taskcontrolblock_s { 
    const char *name; 

    DART_TASK_T routine; 
    DART_CALLBACK_T cleanup_callback; 

    void *arg; 
    unsigned arg_len; 

    union { 
     uint8_t flags; 
     struct { 
     //uint8_t created:1; 
     //uint8_t running:1; 
     //uint8_t blocked:1; 
     //uint8_t suspended:1; 
     //uint8_t killed:1; 
     //uint8_t completed:1; 
     //uint8_t; 
     }; 
    }; 

    int priority; 

    pthread_t thread; 
}__attribute__((packed)); 


static int dispatch_task(int tid) 
{ 
    if (!taskIDs[tid]) // 
     return -1; 

    pthread_attr_t attr; 
    struct sched_param param; 
    param.sched_priority = sysTask[tid].priority; 
    int policy = SCHED_RR; 

    if (pthread_attr_init(&attr)) 
     return -1; 
    if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)) 
     return -1; 
    if (pthread_attr_setschedpolicy(&attr, policy)) 
     return -1; 
    if (pthread_attr_setschedparam(&attr, &param)) 
     return -1; 
    if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) 
     return -1; 

    if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) 
     return -1; 

    if (pthread_create(&sysTask[tid].thread, &attr, sysTask[tid].routine, sysTask[tid].arg)) 
    return -1; 

    pthread_attr_destroy(&attr); 
    return 0; 
} 

Edit:

Вызов perror() печатает массив символов Operation not permitted в stderr.

Запуск программы с правами root разрешил проблему.

+2

Вы оставляете некоторые члены 'struct sched_param param' неинициализированными. –

+2

использовать perror(), чтобы показать причину сбоя, которая поможет нам понять, что не так. –

+2

Обратите внимание, что только пользователю root будет разрешено устанавливать планировщик на SCHED_RR – nos

ответ

2

Первая часть ответа заключается в том, что для использования SCHED_RR у вас должен быть CAP_SYS_NICE для вашего пользователя. Как вы отметили, работая как root, она работает. Но вы можете работать как любой пользователь, если у вас есть возможность «CAP_SYS_NICE». Один из способов получить это - использовать setcap, который объясняется здесь: https://stackoverflow.com/a/37528755/4323

Вам понадобится возможность запускать sudo setcap.