C++ pthreads_create()返回非零值?
在调用C++ pthreads_create()返回非零值?,c++,pthreads,C++,Pthreads,在调用pthread\u create()之前,我创建了一个函数来设置pthread的属性。但是,pthread_create()由于返回非零值而失败。我不确定我的函数设置的属性有什么问题。我正在用ubuntu16.04lts上的g++编译我的程序 要编译和执行,我正在使用: g++ example.cpp -lpthread ./a.out - typedef void*(*省道任务)(void*); typedef void(*省道)(整数); 静态结构taskcontrolblock的系
pthread\u create()
之前,我创建了一个函数来设置pthread
的属性。但是,pthread_create()
由于返回非零值而失败。我不确定我的函数设置的属性有什么问题。我正在用ubuntu16.04lts
上的g++
编译我的程序
要编译和执行,我正在使用:
g++ example.cpp -lpthread
./a.out
-
typedef void*(*省道任务)(void*);
typedef void(*省道)(整数);
静态结构taskcontrolblock的系统任务[MAX_DARTOS_THREADS];
静态无符号最大任务id注册=0;
静态std::位集taskIDs;
结构任务控制块{
常量字符*名称;
飞镖任务例行程序;
省道回调\u T清除回调;
void*arg;
未签名的arg_len;
联合{
uint8_t旗;
结构{
//创建的uint8_t:1;
//uint8_t运行:1;
//uint8_t阻塞:1;
//uint8_t暂停:1;
//死亡8例:1例;
//完成的uint8:1;
//uint8_t;
};
};
int优先级;
pthread\u t线程;
}__属性_uuu((压缩));
静态int调度任务(int tid)
{
如果(!taskIDs[tid])//
返回-1;
pthread_attr_t attr;
结构sched_param param;
param.sched_priority=sysTask[tid]。优先级;
int policy=SCHED_RR;
if(pthread\u attr\u init(&attr))
返回-1;
if(pthread\u attr\u setinheritsched(&attr,pthread\u EXPLICIT\u SCHED))
返回-1;
if(pthread_attr_setschedpolicy(&attr,policy))
返回-1;
if(pthread_attr_setschedparam(&attr,¶m))
返回-1;
if(pthread\u attr\u setscope(&attr,pthread\u SCOPE\u SYSTEM))
返回-1;
if(pthread\u attr\u setdetachstate(&attr,pthread\u CREATE\u distached))
返回-1;
if(pthread_create(&sysTask[tid].thread,&attr,sysTask[tid].routine,sysTask[tid].arg))
返回-1;
pthread_attr_destroy(&attr);
返回0;
}
编辑: 调用
peror()
将不允许的字符数组操作打印到stderr
使用root权限运行程序解决了问题。答案的第一部分是,要使用SCHED\u RR
您必须为您的用户提供CAP\u SYS\u NICE
。正如您所注意到的,以root
身份运行可以使其正常工作。但是,只要您具有CAP\u SYS\u NICE
“功能,您就可以作为任何用户运行。获得该功能的一种方法是使用setcap
,如下所述:
您需要能够运行sudo setcap
答案的第一部分是,要使用SCHED\u RR
,您必须为您的用户提供CAP\u SYS\u NICE
。正如您所注意到的,以root
身份运行可以使其正常工作。但是,只要您具有CAP\u SYS\u NICE
“功能,您就可以作为任何用户运行。获得该功能的一种方法是使用setcap
,如下所述:
您需要能够运行sudo setcap
您将使struct sched_param param
的一些成员未初始化。请使用perror()显示故障原因以帮助我们了解错误。请注意,只有root用户才允许将计划程序设置为SCHED_rr为什么不std::thread
?@LightnessRacesinOrbitstd::thread
支持与PTHREAD\u SCOPE\u SYSTEM
等效的操作系统特定属性,PTHREAD\u CREATE\u DETACHED
、PTHREAD\u EXPLICIT\u SCHED
或SCHED\u RR
?您将使struct SCHED\u param
的一些成员未初始化。请使用peror()显示故障原因以帮助我们了解错误。请注意,只有root用户才允许将计划程序设置为SCHED_rr为什么不std::thread
?@LightnessRacesinOrbitstd::thread
支持与PTHREAD\u SCOPE\u SYSTEM
等效的操作系统特定属性,PTHREAD\u CREATE\u disconnected
,PTHREAD\u EXPLICIT\u SCHED
,或SCHED\u RR
?
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;
}