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) |