kmt.c
最終更新:2009/12/16
001: /* kmt.c 002: * マルチスレッドのサンプル 003: * ・使用するスレッド数を設定 004: */ 005: 006: #define USAGE "Usage: kmt <num_threads>" 007: 008: #include <stdlib.h> 009: 010: #include "apr_general.h" 011: #include "apr_errno.h" 012: #include "apr_file_io.h" 013: #include "apr_thread_proc.h" 014: 015: #include "mytt.h" 016: #include "mystab.h" 017: 018: /* サブスレッドで使うデータの構造体 */ 019: 020: typedef struct _do_it_data_st { 021: int job_id; /* メインスレッドで付与する値 */ 022: apr_file_t *out; /* 出力先ファイルハンドラ */ 023: } do_it_data; 024: 025: /* サブスレッドの処理内容 */ 026: 027: static void* APR_THREAD_FUNC do_it( 028: apr_thread_t *thd /* サブスレッドのスレッドハンドラ */ 029: , void *data /* 使用するデータ */ 030: ) { 031: do_it_data *did = (do_it_data*)data; 032: apr_file_printf(did->out, 033: "\tjob_id=[%02d] START.\n", did->job_id); 034: 035: apr_sleep(1000000); /* 1000000マイクロ秒=1秒スリープ */ 036: 037: apr_file_printf(did->out, 038: "\tjob_id=[%02d] END.\n", did->job_id); 039: 040: apr_thread_exit(thd, APR_SUCCESS); /* 【必須】サブスレッドの終了 */ 041: return NULL; 042: } 043: 044: int apr_my_main ( 045: int ac, char **av 046: , apr_file_t * astdin 047: , apr_file_t * astdout 048: , apr_file_t * astderr 049: , apr_pool_t * pool 050: ) { 051: 052: apr_status_t rv = APR_SUCCESS; 053: 054: int n_threads = 0; 055: int i=0; 056: my_thread_table mtt; 057: apr_thread_t *thd = NULL; 058: 059: 060: if (ac < 2) { 061: apr_file_printf(astderr, "%s\n", USAGE); 062: return 1; /* 異常終了 */ 063: } 064: 065: n_threads = atoi(av[1]); 066: 067: if (n_threads <= 0) { 068: apr_file_printf(astderr, "ERROR: abnormal num_threads\n"); 069: return 1; /* 異常終了 */ 070: } 071: 072: /* スレッドテーブルの初期化 */ 073: 074: /* 075: memset(&mtt, 0, sizeof(my_thread_table)); 076: */ 077: my_thread_table_init(&mtt, n_threads, pool); 078: 079: /* 100個の処理をサブスレッドに並行処理させる。 */ 080: 081: for (i=0; i<100; i++) { 082: do_it_data *did = (do_it_data*)apr_palloc(pool, sizeof(do_it_data)); 083: did->job_id=i; 084: did->out = astdout; 085: 086: if(1)apr_file_printf(astdout, "##job_id=[%d]\n", i); 087: 088: /* サブスレッドの生成 */ 089: 090: rv = my_thread_create (&mtt, &thd, do_it, (void*)did); 091: if (rv != APR_SUCCESS) { 092: char error_buf[32]; 093: apr_file_printf(astderr, "%s\n", 094: apr_strerror(rv, error_buf, sizeof(error_buf))); 095: 096: /* エラーを検出しても続ける。もちろん、ここでループを抜けてもよい。 */ 097: 098: } 099: } 100: 101: /* スレッドテーブルのリセット(全サブスレッドの同期) */ 102: 103: rv = my_thread_table_clear(&mtt); 104: 105: if (rv != APR_SUCCESS) { 106: char error_buf[32]; 107: apr_file_printf(astderr, "%s\n", apr_strerror(rv, error_buf, sizeof(error_buf))); 108: apr_file_printf(astderr, "failed!\n"); 109: return 1; /* 異常終了 */ 110: } 111: 112: apr_file_printf(astdout, "\ndone.\n"); 113: return 0; /* 正常終了 */ 114: 115: } /* end of main */
KAKU PROJECT (2009) |