teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コード修正

2019/11/16 08:44

投稿

torimingo
torimingo

スコア123

title CHANGED
File without changes
body CHANGED
@@ -44,24 +44,25 @@
44
44
  pthread_t thread1, thread2;
45
45
  pthread_attr_t attr1, attr2;
46
46
  struct sched_param parm1, parm2;
47
+ int max_fifo, min_fifo;
47
48
 
48
49
  // スレッド1 (プライオリティを高く設定)
49
50
  pthread_attr_init(&attr1);
50
- pthread_attr_getschedparam(&attr1, &parm1);
51
+ pthread_attr_setinheritsched(&attr1, PTHREAD_EXPLICIT_SCHED);
51
- parm1.sched_priority = sched_get_priority_max(SCHED_FIFO); // プライオリティ
52
- pthread_attr_setschedpolicy(&attr1, SCHED_FIFO); // スケジューリングポリシー
52
+ pthread_attr_setschedpolicy(&attr1, SCHED_FIFO); // スケジューリングポリシー
53
+ max_fifo = sched_get_priority_max(SCHED_FIFO);
54
+ parm1.sched_priority = max_fifo;
53
- pthread_attr_setschedparam(&attr1, &parm1);
55
+ pthread_attr_setschedparam(&attr1, &parm1); // プライオリティ
54
56
  pthread_create(&thread1, &attr1, thread1_func, nullptr);
55
- pthread_setschedparam(thread1, SCHED_FIFO, &parm1);
56
57
 
57
58
  // スレッド2 (プライオリティを低く設定)
58
59
  pthread_attr_init(&attr2);
59
- pthread_attr_getschedparam(&attr2, &parm2);
60
+ pthread_attr_setinheritsched(&attr2, PTHREAD_EXPLICIT_SCHED);
60
- parm2.sched_priority = sched_get_priority_min(SCHED_FIFO); // プライオリティ
61
- pthread_attr_setschedpolicy(&attr2, SCHED_FIFO);       // スケジューリングポリシー
61
+ pthread_attr_setschedpolicy(&attr2, SCHED_FIFO); // スケジューリングポリシー
62
+ min_fifo = sched_get_priority_min(SCHED_FIFO);
63
+ parm2.sched_priority = min_fifo;
62
- pthread_attr_setschedparam(&attr2, &parm2);
64
+ pthread_attr_setschedparam(&attr2, &parm2); // プライオリティ
63
65
  pthread_create(&thread2, &attr2, thread2_func, nullptr);
64
- pthread_setschedparam(thread2, SCHED_FIFO, &parm2);
65
66
 
66
67
  pthread_join(thread1, nullptr);
67
68
  pthread_join(thread2, nullptr);

2

追記

2019/11/16 08:43

投稿

torimingo
torimingo

スコア123

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

1

追記

2019/11/03 21:55

投稿

torimingo
torimingo

スコア123

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,5 @@
1
1
  マルチスレッド初心者です。
2
- 「マルチコア」、「sched_setaffinity()でのマスクなし」という条件、スレッド(pthread_t)プライオリティを効かせることできますか?
2
+ 「マルチコア」、「sched_setaffinity()でのマスクなし」という条件だとプライオリティの低いスレッド(pthread_t)が動いてしまいます。(プライオリティの高いスレッドのスケジューリングポリシー「FIFO」にしています。)
3
+ 上記の条件で、プライオリティを効かせるには、どうしたらよいでしょうか?
3
4
  sched_setaffinity()でマスクすれば、プライオリティが効くのですが、コアを余らせてしまっているような気がして、なにかもったいない気がします。
4
5
  C++の新しい規格だと対応しているライブラリとかあるのでしょうか。