- 締切済み
C++におけるスレッド制御に関して
C++初心者です。 スレッド制御の勉強をしておりますが、 なかなかうまくいきません。 下記のソースのようにスレッド生成をしておりますが、 スレッド用メソッドには、*を付けて使用するしか方法はないのでしょうか? pthread_createに渡す第3パラメータをメソッド名のみにして、呼ばれ元のメソッドの戻り値をvoid* ではなく、void のみで実施したいと思っておりますが、方法がわかりません。 大変申し訳ございませんが、ご教授よろしくお願いいたします。 ############################################################## # pthread_test.cc ############################################################## #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <unistd.h> /* * スレッドパラメータ格納用 */ typedef struct { char printVal; int interval; } ThreadParamT; // スレッドイニシャル関数 void *ThreadTest(void *arg) { ThreadParamT *thread_test_param =(ThreadParamT*)arg; while(1) { fprintf(stderr,"%c", thread_test_param->printVal); sleep(thread_test_param->interval); } return NULL; } int main(int argc,char *argv[]) { int status; // スレッドのパラメータ pthread_t thread_test; ThreadParamT thread_test_param; thread_test_param.printVal = 'a'; thread_test_param.interval = 1; // スレッドを生成 status=pthread_create(&thread_test, NULL, ThreadTest, &thread_test_param); if(status!=0){ fprintf(stderr,"ERR! OUT!\n"); exit(1); } // 10s間待つ sleep(10); fprintf(stderr, "\n"); return 0; } ##############################################################
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 既存メソッド数分のThreadTestが必要になるのかな?と思っております。 機械的に作るんじゃダメ? #include <iostream> /* たしざん */ struct arg_int_int { int x; int y; }; void add(arg_int_int* arg) { std::cout << "add result = " << (arg->x + arg->y) << std::endl; } /* ぜったいち */ struct arg_int { int value; }; void absolute(arg_int* arg) { std::cout << "absolute result = " << ((arg->value > 0) ? arg->value : -arg->value) << std::endl; } /* なんちゃってスレッド生成 */ typedef void* (*thread_entry)(void*); void call(thread_entry entry, void* arg) { (*entry)(arg); } /* 機械的にエントリを生成するマクロ */ #define ENTRY(FUNC) entry##FUNC #define define_ENTRY(FUNC,TYPE) \ void* ENTRY(FUNC)(void* arg) {\ FUNC((TYPE*)arg); \ return 0; \ } /* おためし */ /* add と absolute を作って呼ぶ */ define_ENTRY(add,arg_int_int); define_ENTRY(absolute,arg_int); int main() { arg_int_int aii = { 1, 2 }; arg_int ai = { -3 }; call(ENTRY(add), &aii); call(ENTRY(absolute), &ai); }
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
薄皮一枚かぶせるんじゃダメなんでしょか? void ActualEntry(ThreadParam* param) { while(1) { fprintf(stderr,"%c", param->printVal); sleep(param->interval); } } void *ThreadTest(void *arg) { Actualentry((ThreadParamT*)arg); return NULL; }
お礼
ご回答ありがとうございます。 なるほど~。参考になります。 スレッドの呼び先にワンクッション置くということですね。 実はやりたいことは、既に作成したプログラムをマルチスレッド化したのです。(作成済のプログラムというのは、ファイル操作や、メッセージキュー操作のプログラムとなります。) マルチスレッド化するとなると、既存のメソッドの戻り値をvoid*に変更しなくてはいけないのでは..??という懸念から、既存メソッドに触らずにスレッド化した意向です。 スレッド制御用に、メソッドをひとつ追加して(上記のmainに当たります。)、その制御メソッドにパラメータでスレッド用メソッド名?ポインタ?(上記でいうとThreadTestが既存メソッドになります)を渡すことで、pthread_createにパラメータで指定されたメソッドが起動されるといったことがやりたいのです。 epistemeさんからご教授頂いた方法であれば、既存メソッド数分のThreadTestが必要になるのかな?と思っております。