我已经创建了一个函数,可以在调用pthread
之前设置pthread_create()
的属性。但是,pthread_create()
失败,因为它返回非零值。我不确定函数设置的属性出了什么问题。我正在使用g++
上的Ubuntu 16.04 LTS
编译程序。
要编译和执行我正在使用:
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;
}
编辑:
调用
perror()
将字符数组Operation not permitted
打印到stderr
。以root特权运行该程序解决了该问题。
最佳答案
答案的第一部分是要使用SCHED_RR
,您的用户必须具有CAP_SYS_NICE
。如您所述,以root
身份运行即可正常工作。但是只要您具有CAP_SYS_NICE
“功能”,就可以以任何用户身份运行。一种获取方法是使用setcap
,在此处进行说明:https://stackoverflow.com/a/37528755/4323
您将需要具有运行sudo setcap
的能力。