pthreads_create()返回非零值

pthreads_create () returns non-zero value?

本文关键字:返回 非零值 create pthreads      更新时间:2023-10-16

我在调用 pthread_create()之前创建了一个函数来设置 pthread的属性。但是,pthread_create()由于返回非零值而失败。我不确定我的功能设置的属性是什么问题。我正在用Ubuntu 16.04 LTS上的g++编译程序。

要编译和执行我正在使用:

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;
}

编辑:

调用perror()将字符阵列Operation not permitted打印到stderr

用根特权运行程序解决了问题。

答案的第一部分是要使用SCHED_RR,您必须为用户使用CAP_SYS_NICE。如您所指出的,作为root的运行使其正常工作。但是,只要您拥有CAP_SYS_NICE"功能",就可以作为任何用户运行。一种方法是使用setcap,此处解释:https://stackoverflow.com/a/37528755/4323

您将需要运行sudo setcap的能力。