Я создал функцию для установки атрибутов 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, ¶m))
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 разрешил проблему.
Вы оставляете некоторые члены 'struct sched_param param' неинициализированными. –
использовать perror(), чтобы показать причину сбоя, которая поможет нам понять, что не так. –
Обратите внимание, что только пользователю root будет разрешено устанавливать планировщик на SCHED_RR – nos