2017-12-19 59 views
-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の最初の呼び出しが返されないことを考え出しました。私は数時間待ったが、何も起こらなかった。

glibcldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23です。

+0

最初の呼び出しでは、cpuゼロに親和性を設定する必要がありますか?より優先度の高いものが既にそこに走っていますか?あなたはcgroupでこれを実行していますか?スケジューリングとアフィニティに影響する可能性のあるものは何ですか?呼び出しが返ってこない場合、おそらくあなたのスレッドはもはやスケジュールされていません。 – Useless

+0

投稿されたスニペットは、コアごとに1つ、他のスレッドを作成しているメインスレッドから呼び出されます。スケジューリングと親和性に影響する可能性のある他のスレッドはありません。呼び出し元のスレッドを決して再度スケジューリングしないのはなぜですか? – jagemue

+0

FWIW、Ubuntu 14で動作します.12コアあり、cpu_countが13より低い限り、すべて正常です。 cpu_countを12以上にすると、pthread_createは失敗します(アフィニティは存在しないCPUに設定されている可能性が高いため)。 –

答えて

1

私のコードは(基本的には質問と同じですが)、12コアマシンのUbuntu(実際にはGoobuntu)14で動作します。変数nrを減らしてコアの数が少ないマシンで実行できるようにする。

#include <pthread.h> 

#include <unistd.h> 

#include <iostream> 

using std::cerr; 
using std::cout; 

const int cpu_count = 12; 
pthread_t thread_objs[cpu_count]; 
pthread_attr_t attr; 
cpu_set_t cpus; 

void* start_routine(void*) 
{ 
    sleep(2); 

    return 0; 
} 

int main() 
{ 
    pthread_attr_init(&attr); 

    for (unsigned int t = 0; t < cpu_count; t++) { 
     pthread_t new_thread; 
     CPU_ZERO(&cpus); 
     CPU_SET(t, &cpus); 

     cout << "Nr of set cpus in set: " << CPU_COUNT(&cpus) << '\n'; 

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

    cout << "Joined all threads, ending!\n"; 
} 
関連する問題