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