綾小路龍之介の素人思考

時間がかかるので、各ステップで動作確認したい

開始から終了まで1月とか、計算に時間がかかる場合。こんなこと結構あるわけで、うまく計算が進んでいるか1月間もの間心配続きだ。そんな場合、動作チェック用のスレッドと計算用のスレッドを作り、適当な時間間隔で動作チェック用スレッドから計算用スレッドの状態を参照すればよいのではなかろうか。5分くらいで書いたのでなんだか危険な香りがぷんぷんするな。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pthread.h>
typedef struct {
        pthread_t ctrl;
        pthread_t run;
        unsigned int s;
        size_t i;
        size_t i_num;
        double x_i;
        double y_i;
} param;
void param_new(param * p)
{
        p->s = 5;
        p->i_num = 100;
        return;
}
void param_print(param * p)
{
        printf("# p\t(% x)\n", &p);
        printf("# p->ctrl\t(% x)\t=\t% d\n", &p->ctrl, p->ctrl);
        printf("# p->run\t(% x)\t=\t% d\n", &p->run, p->run);
        printf("# p->i_num\t(% x)\t=\t% d\n", &p->i_num, p->i_num);
        printf("# p->i\t(% x)\t=\t% d\n", &p->i, p->i);
        printf("# p->x_i\t(% x)\t=\t% e\n", &p->x_i, p->x_i);
        printf("# p->y_i\t(% x)\t=\t% e\n", &p->y_i, p->y_i);
        return;
}
void param_free(param * p)
{
        return;
}
void *ctrl(void *p_)
{
        param *p = (param *) p_;
        int ch;
        char buf[10];
        char c[] = "q";
        char d[] = "q";
        printf("# ctrl start %d\n", &p);
        do {
                sleep(p->s);
                printf("% e\t", p->x_i);
                printf("% e\t", p->y_i);
                printf("% d\n", p->i);
        } while (p->run != 0);
        printf("# ctrl end %d\n", &p);
        return;
}
void *run(void *p_)
{
        param *p = (param *) p_;
        size_t i_num = p->i_num;
        size_t i = 0;
        double x_i = 0.0;
        double y_i = 0.0;
        for (i = 0; i < i_num; i++) {
                x_i = (double) i *0.1;
                y_i = x_i * x_i;
                p->i = i;
                p->x_i = x_i;
                p->y_i = y_i;
                sleep(1);
        }
        return;
}
int main(int argc, char **argv)
{
        int s = 0;
        void *result = (void *)NULL;
        param *p = (param *) calloc(1, sizeof(param));
        param_new(p);
        param_print(p);
        s = pthread_create(&p->ctrl, NULL, ctrl, (void *) p);
        if (s != 0) {
                fprintf(stderr, "pthread_create : %s\n", strerror(s));
        }
        s = pthread_create(&p->run, NULL, run, (void *) p);
        if (s != 0) {
                fprintf(stderr, "pthread_create : %s\n", strerror(s));
        }
        p->run = pthread_join(p->run, &result);
        p->ctrl = pthread_join(p->ctrl, &result);
        param_print(p);
        param_free(p);
        free(p);
        return 0;
}

まぁこんな感じかな。runが計算スレッド、ctrlがチェックスレッド。runではx_i=0から0.1刻みでy=x*xの計算を行っている。ここが時間がかかる処理に相当する。で、各ステップiごとにiとx_iとy_iを更新し、これをチェックスレッドが参照できる構造体pの各メンバに代入している。ctrlでは、p->s秒ごとにrunで代入したi,x_i,y_iをチェックして表示している。runの終了はpthrad_joinの戻り値が0になっているかどうかでチェック、ctrlスレッドの終了はrunスレッドが終了したら終了するように、runスレッド番号を参照し、これが0なら終了するようにしている。

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-07-28T06:03:13+09:00
  2. Modified: 2007-07-28T03:57:13+09:00
  3. Generated: 2017-11-05T23:09:15+09:00