#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なら終了するようにしている。