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の数字の小さい方が最後になる。大きい方が優先されて実行される。



コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法