プロが教える店舗&オフィスのセキュリティ対策術

現在プログラムでマルチスレッドをやろうとしているのですが、
マルチスレッドの関数に数値や配列などの引数を渡すことは可能でしょうか?
MSDNで調べてみると、_beginthreadex関数の4番目のNULLのところに引数リストを
指定できるとあったのですが、その意味が良くわかりませんでした。
以下のプログラムの場合にマルチスレッドに変数a, b, cを引数として渡したい場合は
どのように書けばいいのでしょうか?

#include<stdio.h>
#include<windows.h>
#include<process.h>

unsigned WINAPI MyThread( void *lpx ){
while (1)
{
printf("スレッド実行中\n");
Sleep(1000);
}
return 0;
}

void main(){
// スレッドに渡したい変数の宣言
int a = 128;
int b = 256;
int c = 512;

// スレッドIDの宣言
DWORD thID;

// マルチスレッドの開始
(HANDLE)_beginthreadex( NULL, 0, &MyThread, NULL, 0, (unsigned int*)&thID );

// ループ
while (1)
{
printf("メイン関数実行中\n");
Sleep(2000);
}
}

A 回答 (4件)

★アドバイス


・過去に似たような質問がありました。
 http://oshiete1.goo.ne.jp/qa2916783.html→『マルチスレッドについて』
 ↑これは _beginthread ですが引数の渡し方は同じです。
http://www.kumei.ne.jp/c_lang/sdk/sdk_87.htm→『第87章 マルチスレッド その1』
http://www.kumei.ne.jp/c_lang/sdk/sdk_88.htm→『第88章 マルチスレッド その2』
http://www.kumei.ne.jp/c_lang/sdk/sdk_89.htm→『第89章 マルチスレッド その3』
http://www.kumei.ne.jp/c_lang/intro/no_99.htm→『99章 マルチスレッド その1』
 ↑質問のソースは、ここと同じですね。

サンプル:
#include <stdio.h>
#include <windows.h>
#include <process.h>

// 渡したいすべての引数の構造体を宣言(自由に)
typedef struct {
 int a;
 int b;
 int c;
} PARAM, *lpPARAM;

// スレッド側
unsigned WINAPI MyThread( void *lpx )
{
 lpPARAM lpParam = (lpPARAM)lpx; ←ここで構造体を受け取る
 
 for ( ; ; ){
  printf( "スレッド実行中\n" );
  printf( "a = %d\n", lpParam->a );
  printf( "b = %d\n", lpParam->b );
  printf( "c = %d\n", lpParam->c );
  Sleep( 1000 );
 }
 return 0;
}

// メイン側
int main( void )
{
 HANDLE hThread;
 DWORD thID; // スレッドIDの宣言
 PARAM param;
 
 // 渡したいすべての引数を構造体にセット
 param.a = 128; ←引数a
 param.b = 256; ←引数b
 param.c = 512; ←引数c
 
 // マルチスレッドの開始
 hThread = beginthreadex( NULL, 0, MyThread, &param, 0, (unsigned int*)&thID ); ←構造体を渡す
  :
 処理(メイン関数実行中)
  :
 CloseHandle( hThread );
 return 0;
}
    • good
    • 0
この回答へのお礼

なかなかお礼ができなくて申し訳ありません。
とても助かりました。

お礼日時:2007/06/22 06:06

既に回答付いていますが…


構造体に入れてポインタを渡すのがよく取られる方法です。

なお、渡す場合にはその構造体の寿命(というか、呼び出し側での構造体の寿命)に注意が必要です。
ローカル変数使う場合は…ですが。
    • good
    • 0

ボケるわけではありませんが、特定環境に依存した質問の場合は、環境を明らかにしましょう。


そもそもMSDNで調べること自体が間違っている可能性もあるわけですから。
    • good
    • 0

最も簡単な方法は、a,b,cをメンバに持つ構造体を定義し


その構造体のポインタを渡すことで可能です。
データ構造さえ自分で作る気があれば他の方法もとれますが、
これが一番安全だと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています