課題としてユーザーレベルのマルチスレッドを作るという課題があったので、まずはスレッドをLinuxのsetcontext,getcontext,makecontext,swapconetextを使って実装するまでをやってみた。
とりあえず簡単にkin,patsuと別スレッドで表示させるものを作ってみた
※後輩が課題スタートするのでコードを一時伏せます
# include<stdio.h>
# include<stdlib.h>
# include "mythread.h"
void f1(void *args){
int i,j;
char *str = (char*)args;
for(i=0;i<10;i++){
printf("%s\n",str);
for(j=0; j<10000000; j+= 1 + rand()%2);
}
}
int main(int argc,char **argv){
int t1,t2;
mythread_init();
t1 = mythread_create(f1,"kin");
t2 = mythread_create(f1,"patsu");
mythread_join(t1);
mythread_join(t2);
return 0;
}
実際にはsetcontextは使わなかった。
その理由として上の4つの関数の仕組みが
setcontext:コンテキストの内容をリストアする
getcontext:コンテキストの内容を取得する
makecontext:コンテキストと関数を紐づける
swapcontext:コンテストの内容をリストアし、次のコンテキストの内容を取得する
といった感じでswapcontextを使えばsetcontextを使う必要がない
getcontextは最初にスレッドを作るときには必須のようだ。
考察的な何か
そしてこのライブラリ的な何かについて、ヘッダーと一括にしてしまっているので分ける必要があるのはそうなのだが、スレッドに結びつけた関数の処理終了後のスレッドの終了に分岐するのをやっていないためそこのあたりをやる必要はある。
いろいろソース見ればわかるが自分でも不具合は多いなとは感じてる。とりあえずPOSIXスレッドを使わなくても自分でもユーザレベルスレッドは作れるんだよ的な確認のためなのでそこらへんは見逃して欲しい。
まだ改良はするので改良したら記事を更新しようかなと....
結果
きんいろモザイクはすばらしい