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
?@LightnessRacesinOrbit
std::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
?@LightnessRacesinOrbit
std::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, &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;
}