RTOS: RTOSのためのpthread、その2
その1では、スレッドの優先順位がないので、Aで終わったり、Bで終わったりとランダムに終わっていた。
今回はプライオリティをつける。pthreadでpriorityは属性の中で定義される。属性はいろいろあるが、priority以外の属性を使う事がない・・・(RTOSのためのスレッドであれば本当に使う事がない)
pthread_attr_t という型で、属性を定義する。
struct sched_param priParam;
で属性パラメータの構造体を定義。priParamの部分は適当な名前にする。
属性を有効にするためには初期化作業が必要で
pthread_attr_init(&attrs1);
と属性を初期化する。&を先頭につけてアドレスでわたす。
priParam1.sched_priority = 1;
pthread_attr_setschedparam(&attrs1, &priParam1);
上の行で属性の中のsched_priorityを1に設定する。priorityは数字が大きいほど優先順位が高い。次の行でこのパラメータをセットする。
今回はpriorityだけの属性を指定しているが、threadのサイズ等の属性を指定する事もできる。
pthread_attr_setstacksize(&attrs, THREADSTACKSIZE);
といったような感じ
その1では pthread_createで属性はNULLとしていたが
pthread_create(&thread1, &attrs1, funcA, NULL);
として第二引数に属性を渡してあげる。
以下はサンプルプログラム。
/*This is a test for pthread.
* it give a priority.
* always program finish lower priority thread finally.
*/
#include <stdio.h>
#include <pthread.h>
int number=100;
void* funcA(void* ptr) {
int i = 0;
int j=0;
for (i = 1; i <= number; i++) {
printf("A:%d\n",i);
for (j= 1; j <= 100000; j++) {}
}
}
void* funcB(void* ptr) {
int i = 0;
int j=0;
for (i = 1; i <= number; i++) {
printf("B:%d\n",i);
for (j= 1; j <= 100000; j++) {}
}
}
int main()
{
printf("Proprity A=1, B=2\n");
pthread_t thread1, thread2;
pthread_attr_t attrs1,attrs2;
struct sched_param priParam1,priParam2;
/* Initialize the attributes structure with default values */
pthread_attr_init(&attrs1);
pthread_attr_init(&attrs2);
/* Set priority, detach state, and stack size attributes */
priParam1.sched_priority = 1;
pthread_attr_setschedparam(&attrs1, &priParam1);
priParam2.sched_priority = 2;
pthread_attr_setschedparam(&attrs2, &priParam2);
pthread_create(&thread1, &attrs1, funcA, NULL);
pthread_create(&thread2, &attrs2, funcB, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
実行結果:
必ずpriorityの数字の小さい方が最後になる。大きい方が優先されて実行される。
コメント
コメントを投稿