制御構造の処理(C言語版)の設計ノート 20050616 -MT- 20050825 -MT- 20060407 -KM- 20060912 -MT- + スレッドの管理方法 - スレッド構造体のリンクで管理する。 + 処理に用いられるクラス - ums__dat_t /* データ処理構造体 */ - ums__list_t /* リスト処理構造体(list に対応) */ - ums__loop_t /* ループ処理構造体(optional, oneOrMore, zeroOrMore に対応) */ - ums__interleave_t /* インターリーブ処理構造体(interleave に対応) */ - ums__thread_t /* スレッド処理構造体 */ - ums__threadMng_t /* スレッド管理構造体 */ - ums__threadMngInterleave_t /* インターリーブに関わるスレッド管理構造体 */ + スレッド変数 - id /* スレッド識別ID */ - condition /* スレッド状態 */ - position /* スレッド処理位置 */ - nextThreadNo /* 次スレッド構造体番号 */ - dat /* データ情報 */ - list /* リスト情報 */ - loop /* ループ情報 */ - il /* インターリーブ情報 */ + スレッド管理変数 - num_alive /* 存在するタスクの数 */ - currentThreadNumber /* 実行中のタスク配列の index */ - firstFreeThreadNumber /* 起動していないのタスク配列の先頭の index */ - firstUsedThreadNumber /* 起動中のタスク配列の先頭の index */ - *dat_array /* タスク配列の先頭アドレス */ + 生成ソースイメージ void function( char *ums__buffer, int ums__bitlen, ums__exception_t *ums__ex ) { /* 変数の宣言・代入 */ ums__dat_t *ums__dat; ums__list_t *ums__list; ums__loop_t *ums__loop; ums__interleave_t *ums__interleave; ums__thread_t ums__thread_array[UMS__NUM_THREAD]; ums__thread_t *ums__thread = &( ums__thread_array[0] ); ums__thread_mng_t ums__thread_mng; ums__thread_mng_t *ums__thread_mngp = &ums__thread_mng; ums__thread_mng_interleave_t ums__thread_mng_interleave; ums__thread_mng_interleave_t *ums__thread_mng_interleavep = &ums__thread_mng_interleave; ums__dat = &(ums__thread->dat); ums__list = &(ums__thread->list); ums__loop = &(ums__thread->loop); ums__interleave = &(ums__thread->il); /* 変数の初期化 */ ums__dat_init( ums__dat, ums__buffer, ums__bitlen ); ums__list_init( ums__list ); ums__loop_init( ums__loop ); ums__interleave_init( ums__interleave ); ums__thread_init( ums__thread ); ums__thread_mng_init( ums__thread_mngp, ums__thread ); ums__thread_mng_interleave_init( ums__thread_mng_interleavep ); for ( ; ; ) { /* task loop */ /* タスクの起動処理 */ ums__thread = ums__thread_mng_awake( ums__thread_mngp ); /* 分岐先の取得 */ cpos = ums__thread->position; for ( ; ; ) { /* jump loop */ switch ( cpos ) { case 1: ... ums__thread->condition = UMS__THREAD_END; break; } break; } /* end of jump loop */ if ( ums__ex->occured != UMS__STATE_OK ) { ums__ex->occured = UMS__STATE_OK; ums__thread_mng_remove( ums__thread_mngp ); ums__ex->spos = ums__thread_mngp->spos; ums__thread_mngp->currentState = ums__ex; ums__thread_mng_setException( ums__thread_mngp ); } // 制御構造の終了判定 if ( ums__thread_mng_isFinished( ums__thread_mngp ) ) { break; } } /* end of task loop */ } 以上 改版履歴 日付 作成 ファイル名 20060407 -KM- 2006040603 - 例外の際に remove/task 切り替えもしくは異常終了の判定を thread manager レベルで行うように変更。 remove 処理は thread manager にて共通的に実施。 - oneOrMore/zeroOrMore のエラーの取り扱いが JAVA と違う。 C では そのまま throw する。 20060912 -MT- 2006091202 - 最新の処理モデルを反映 (UmsDat, UmsList, UmsLoop, UmsInterleave, UmsThread, UmsThreadMng, UmsThreadMngInterleave)