2016-12-20 6 views
0

私はを呼び出す前にpthreadの属性を設定する関数を作成しました。ただし、0以外の値を返すので、pthread_create()は失敗しています。私は、自分の機能によって設定された属性に何が間違っているか分かりません。私はg++Ubuntu 16.04 LTSで私のプログラムをコンパイルしています。にperror()プリント文字配列Operation not permittedを呼び出すpthreads_create()はゼロ以外の値を返しますか?

: -

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

編集

g++ example.cpp -lpthread 
./a.out 

私が使用していますコンパイルして実行するには。

root権限でプログラムを実行することで問題は解決しました。

+2

'struct sched_pa​​ram param'のいくつかのメンバーを初期化しないままにしています。 –

+2

perror()を使用して、何が間違っているかを理解するのに役立つ障害の原因を表示します。 –

+2

rootユーザだけがSCHED_RR – nos

答えて

2

回答の最初の部分は、SCHED_RRを使用するには、あなたのユーザーにCAP_SYS_NICEが必要です。ご承知のとおり、rootとして実行すると動作します。しかし、あなたはCAP_SYS_NICE "能力"を持っている限り、どのようなユーザーでも実行できます。それを得る1つの方法は、ここで説明されているsetcapを使用しています。https://stackoverflow.com/a/37528755/4323

sudo setcapを実行する必要があります。

関連する問題