kmt.c

最終更新:2009/12/16

kmt.c

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 */
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)