私はを呼び出す前に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, ¶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;
}
編集
g++ example.cpp -lpthread
./a.out
:
私が使用していますコンパイルして実行するには。
root権限でプログラムを実行することで問題は解決しました。
'struct sched_param param'のいくつかのメンバーを初期化しないままにしています。 –
perror()を使用して、何が間違っているかを理解するのに役立つ障害の原因を表示します。 –
rootユーザだけがSCHED_RR – nos