-1
私は2本のスレッドを開始しようとしています。それぞれのコアは4コア - > 4スレッドです。 ピン彼らのコアにスレッドが次のようになります。pthread_attr_setaffinity_npがエラーを返さない、またはスローしない
pthread_t thread_objs[cpu_count];
pthread_attr_t attr;
cpu_set_t cpus;
pthread_attr_init(&attr);
for (unsigned int t = 0; t < cpu_count; t++) {
pthread_t new_thread;
CPU_ZERO(&cpus);
CPU_SET(t, &cpus);
if(pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpus)) {
std::cerr << "fatal: could not set affinity" << std::endl;
return 1;
}
if(pthread_create(&thread_objs[t], &attr, start_routine, NULL)) {
std::cerr << "fatal: thread creation failed" << std::endl;
return 1;
}
}
for (unsigned int t = 0; t < cpu_count; t++) {
pthread_join(thread_objs[t], NULL);
}
ながらのテスト、私はpthread_attr_setaffinity_np
の最初の呼び出しが返されないことを考え出しました。私は数時間待ったが、何も起こらなかった。
glibc
はldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
です。
最初の呼び出しでは、cpuゼロに親和性を設定する必要がありますか?より優先度の高いものが既にそこに走っていますか?あなたはcgroupでこれを実行していますか?スケジューリングとアフィニティに影響する可能性のあるものは何ですか?呼び出しが返ってこない場合、おそらくあなたのスレッドはもはやスケジュールされていません。 – Useless
投稿されたスニペットは、コアごとに1つ、他のスレッドを作成しているメインスレッドから呼び出されます。スケジューリングと親和性に影響する可能性のある他のスレッドはありません。呼び出し元のスレッドを決して再度スケジューリングしないのはなぜですか? – jagemue
FWIW、Ubuntu 14で動作します.12コアあり、cpu_countが13より低い限り、すべて正常です。 cpu_countを12以上にすると、pthread_createは失敗します(アフィニティは存在しないCPUに設定されている可能性が高いため)。 –