我已经创建了一个函数,可以在调用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, &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

以root特权运行该程序解决了该问题。

最佳答案

答案的第一部分是要使用SCHED_RR,您的用户必须具有CAP_SYS_NICE。如您所述,以root身份运行即可正常工作。但是只要您具有CAP_SYS_NICE“功能”,就可以以任何用户身份运行。一种获取方法是使用setcap,在此处进行说明:https://stackoverflow.com/a/37528755/4323

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

10-08 11:51