質問編集履歴

3

コード修正

2019/11/16 08:44

投稿

torimingo
torimingo

スコア122

test CHANGED
File without changes
test CHANGED
@@ -90,23 +90,25 @@
90
90
 
91
91
  struct sched_param parm1, parm2;
92
92
 
93
+ int max_fifo, min_fifo;
94
+
93
95
 
94
96
 
95
97
  // スレッド1 (プライオリティを高く設定)
96
98
 
97
99
  pthread_attr_init(&attr1);
98
100
 
99
- pthread_attr_getschedparam(&attr1, &parm1);
101
+ pthread_attr_setinheritsched(&attr1, PTHREAD_EXPLICIT_SCHED);
100
102
 
101
- parm1.sched_priority = sched_get_priority_max(SCHED_FIFO); // プライオティ
103
+ pthread_attr_setschedpolicy(&attr1, SCHED_FIFO); // スケジューングポリシー
102
104
 
103
- pthread_attr_setschedpolicy(&attr1, SCHED_FIFO); // スケジューリングポリシー
105
+ max_fifo = sched_get_priority_max(SCHED_FIFO);
104
106
 
107
+ parm1.sched_priority = max_fifo;
108
+
105
- pthread_attr_setschedparam(&attr1, &parm1);
109
+ pthread_attr_setschedparam(&attr1, &parm1); // プライオリティ
106
110
 
107
111
  pthread_create(&thread1, &attr1, thread1_func, nullptr);
108
-
109
- pthread_setschedparam(thread1, SCHED_FIFO, &parm1);
110
112
 
111
113
 
112
114
 
@@ -114,17 +116,17 @@
114
116
 
115
117
  pthread_attr_init(&attr2);
116
118
 
117
- pthread_attr_getschedparam(&attr2, &parm2);
119
+ pthread_attr_setinheritsched(&attr2, PTHREAD_EXPLICIT_SCHED);
118
120
 
119
- parm2.sched_priority = sched_get_priority_min(SCHED_FIFO); // プライオティ
121
+ pthread_attr_setschedpolicy(&attr2, SCHED_FIFO); // スケジューングポリシー
120
122
 
121
- pthread_attr_setschedpolicy(&attr2, SCHED_FIFO);       // スケジューリングポリシー
123
+ min_fifo = sched_get_priority_min(SCHED_FIFO);
122
124
 
125
+ parm2.sched_priority = min_fifo;
126
+
123
- pthread_attr_setschedparam(&attr2, &parm2);
127
+ pthread_attr_setschedparam(&attr2, &parm2); // プライオリティ
124
128
 
125
129
  pthread_create(&thread2, &attr2, thread2_func, nullptr);
126
-
127
- pthread_setschedparam(thread2, SCHED_FIFO, &parm2);
128
130
 
129
131
 
130
132
 

2

追記

2019/11/16 08:43

投稿

torimingo
torimingo

スコア122

test CHANGED
File without changes
test CHANGED
@@ -7,3 +7,135 @@
7
7
  sched_setaffinity()でマスクすれば、プライオリティが効くのですが、コアを余らせてしまっているような気がして、なにかもったいない気がします。
8
8
 
9
9
  C++の新しい規格だと対応しているライブラリとかあるのでしょうか。
10
+
11
+
12
+
13
+ コードを以下に掲載します。
14
+
15
+ -DNO_AFFINITYオプションを付加せずにコンパイルすると、アフィニティの設定が効き、プライオリティの設定が効きます。
16
+
17
+ スーパーユーザで実行すると、thread1_func()が終了してから、thread2_func()が実行されます。(自分の環境だけかもしれませんが)
18
+
19
+ -DNO_AFFINITYオプションを付加してコンパイルすると、アフィニティの設定がなくなり、プライオリティが効かなくなります。
20
+
21
+ thread1_func()とthread2_func()は交互に実行されます。
22
+
23
+ アフィニティの設定をせずに(#ifndef NO_AFFINITYから#endifまでを消去した状態で)プライオリティを効かせるにはどうしたらよいでしょうか。
24
+
25
+
26
+
27
+ ```c++
28
+
29
+ #include <iostream>
30
+
31
+ #include <pthread.h>
32
+
33
+
34
+
35
+ void *thread1_func(void *p)
36
+
37
+ {
38
+
39
+ for(int i = 0; i < 10; ++i)
40
+
41
+ std::cout << "スレッド1\n";
42
+
43
+ }
44
+
45
+
46
+
47
+ void *thread2_func(void *p)
48
+
49
+ {
50
+
51
+ for(int i = 0; i < 10; ++i)
52
+
53
+ std::cout << "スレッド2\n";
54
+
55
+ }
56
+
57
+
58
+
59
+ int main()
60
+
61
+ {
62
+
63
+ #ifndef NO_AFFINITY
64
+
65
+ // アフィニティ
66
+
67
+ cpu_set_t mask;
68
+
69
+ CPU_ZERO(&mask);
70
+
71
+ CPU_SET(0, &mask);
72
+
73
+
74
+
75
+ if(sched_setaffinity(0, sizeof(mask), &mask) == -1){
76
+
77
+ std::cout << "アフィニティの設定に失敗しました\n";
78
+
79
+ }
80
+
81
+ #endif
82
+
83
+
84
+
85
+ // スレッド
86
+
87
+ pthread_t thread1, thread2;
88
+
89
+ pthread_attr_t attr1, attr2;
90
+
91
+ struct sched_param parm1, parm2;
92
+
93
+
94
+
95
+ // スレッド1 (プライオリティを高く設定)
96
+
97
+ pthread_attr_init(&attr1);
98
+
99
+ pthread_attr_getschedparam(&attr1, &parm1);
100
+
101
+ parm1.sched_priority = sched_get_priority_max(SCHED_FIFO); // プライオリティ
102
+
103
+ pthread_attr_setschedpolicy(&attr1, SCHED_FIFO); // スケジューリングポリシー
104
+
105
+ pthread_attr_setschedparam(&attr1, &parm1);
106
+
107
+ pthread_create(&thread1, &attr1, thread1_func, nullptr);
108
+
109
+ pthread_setschedparam(thread1, SCHED_FIFO, &parm1);
110
+
111
+
112
+
113
+ // スレッド2 (プライオリティを低く設定)
114
+
115
+ pthread_attr_init(&attr2);
116
+
117
+ pthread_attr_getschedparam(&attr2, &parm2);
118
+
119
+ parm2.sched_priority = sched_get_priority_min(SCHED_FIFO); // プライオリティ
120
+
121
+ pthread_attr_setschedpolicy(&attr2, SCHED_FIFO);       // スケジューリングポリシー
122
+
123
+ pthread_attr_setschedparam(&attr2, &parm2);
124
+
125
+ pthread_create(&thread2, &attr2, thread2_func, nullptr);
126
+
127
+ pthread_setschedparam(thread2, SCHED_FIFO, &parm2);
128
+
129
+
130
+
131
+ pthread_join(thread1, nullptr);
132
+
133
+ pthread_join(thread2, nullptr);
134
+
135
+
136
+
137
+ return 0;
138
+
139
+ }
140
+
141
+ ```

1

追記

2019/11/03 21:55

投稿

torimingo
torimingo

スコア122

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