マルチスレッド初心者です。
「マルチコア」、「sched_setaffinity()でのマスクなし」という条件だと、プライオリティの低いスレッド(pthread_t)が動いてしまいます。(プライオリティの高いスレッドのスケジューリングポリシーは「FIFO」にしています。)
上記の条件で、プライオリティを効かせるには、どうしたらよいでしょうか?
sched_setaffinity()でマスクすれば、プライオリティが効くのですが、コアを余らせてしまっているような気がして、なにかもったいない気がします。
C++の新しい規格だと対応しているライブラリとかあるのでしょうか。
コードを以下に掲載します。
-DNO_AFFINITYオプションを付加せずにコンパイルすると、アフィニティの設定が効き、プライオリティの設定が効きます。
スーパーユーザで実行すると、thread1_func()が終了してから、thread2_func()が実行されます。(自分の環境だけかもしれませんが)
-DNO_AFFINITYオプションを付加してコンパイルすると、アフィニティの設定がなくなり、プライオリティが効かなくなります。
thread1_func()とthread2_func()は交互に実行されます。
アフィニティの設定をせずに(#ifndef NO_AFFINITYから#endifまでを消去した状態で)プライオリティを効かせるにはどうしたらよいでしょうか。
c++
1#include <iostream> 2#include <pthread.h> 3 4void *thread1_func(void *p) 5{ 6 for(int i = 0; i < 10; ++i) 7 std::cout << "スレッド1\n"; 8} 9 10void *thread2_func(void *p) 11{ 12 for(int i = 0; i < 10; ++i) 13 std::cout << "スレッド2\n"; 14} 15 16int main() 17{ 18#ifndef NO_AFFINITY 19 // アフィニティ 20 cpu_set_t mask; 21 CPU_ZERO(&mask); 22 CPU_SET(0, &mask); 23 24 if(sched_setaffinity(0, sizeof(mask), &mask) == -1){ 25 std::cout << "アフィニティの設定に失敗しました\n"; 26 } 27#endif 28 29 // スレッド 30 pthread_t thread1, thread2; 31 pthread_attr_t attr1, attr2; 32 struct sched_param parm1, parm2; 33 int max_fifo, min_fifo; 34 35 // スレッド1 (プライオリティを高く設定) 36 pthread_attr_init(&attr1); 37 pthread_attr_setinheritsched(&attr1, PTHREAD_EXPLICIT_SCHED); 38 pthread_attr_setschedpolicy(&attr1, SCHED_FIFO); // スケジューリングポリシー 39 max_fifo = sched_get_priority_max(SCHED_FIFO); 40 parm1.sched_priority = max_fifo; 41 pthread_attr_setschedparam(&attr1, &parm1); // プライオリティ 42 pthread_create(&thread1, &attr1, thread1_func, nullptr); 43 44 // スレッド2 (プライオリティを低く設定) 45 pthread_attr_init(&attr2); 46 pthread_attr_setinheritsched(&attr2, PTHREAD_EXPLICIT_SCHED); 47 pthread_attr_setschedpolicy(&attr2, SCHED_FIFO); // スケジューリングポリシー 48 min_fifo = sched_get_priority_min(SCHED_FIFO); 49 parm2.sched_priority = min_fifo; 50 pthread_attr_setschedparam(&attr2, &parm2); // プライオリティ 51 pthread_create(&thread2, &attr2, thread2_func, nullptr); 52 53 pthread_join(thread1, nullptr); 54 pthread_join(thread2, nullptr); 55 56 return 0; 57}
回答1件
あなたの回答
tips
プレビュー