
現在プログラムでマルチスレッドをやろうとしているのですが、
マルチスレッドの関数に数値や配列などの引数を渡すことは可能でしょうか?
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);
}
}
No.3ベストアンサー
- 回答日時:
★アドバイス
・過去に似たような質問がありました。
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, ¶m, 0, (unsigned int*)&thID ); ←構造体を渡す
:
処理(メイン関数実行中)
:
CloseHandle( hThread );
return 0;
}
No.4
- 回答日時:
既に回答付いていますが…
構造体に入れてポインタを渡すのがよく取られる方法です。
なお、渡す場合にはその構造体の寿命(というか、呼び出し側での構造体の寿命)に注意が必要です。
ローカル変数使う場合は…ですが。
No.2
- 回答日時:
ボケるわけではありませんが、特定環境に依存した質問の場合は、環境を明らかにしましょう。
そもそもMSDNで調べること自体が間違っている可能性もあるわけですから。
No.1
- 回答日時:
最も簡単な方法は、a,b,cをメンバに持つ構造体を定義し
その構造体のポインタを渡すことで可能です。
データ構造さえ自分で作る気があれば他の方法もとれますが、
これが一番安全だと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【初月無料キャンペーン実施中】オンライン健康相談gooドクター
24時間365日いつでも医師に健康相談できる!詳しくはコチラ>>
-
マルチスレッドについて
C言語・C++・C#
-
WaitForSingleObjectの使い方について
C言語・C++・C#
-
スレッドの終了の仕方
C言語・C++・C#
-
4
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
5
_beginthreadexで生成したスレッドの返り値を取得する方法
C言語・C++・C#
-
6
HANDLEの宣言でのエラー
C言語・C++・C#
-
7
charからLPTSTRへの変換方法
C言語・C++・C#
-
8
マルチスレッドプログラミングについて
C言語・C++・C#
-
9
CString から LPCTSTRの型に変換
C言語・C++・C#
-
10
CloseHandle()
C言語・C++・C#
-
11
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
12
ハンドルはポインタか
C言語・C++・C#
-
13
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
14
LPSTR型の初期化について
C言語・C++・C#
-
15
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
16
C言語のPathFileExistsについて
C言語・C++・C#
-
17
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
18
LRESULTとHRESULT
C言語・C++・C#
-
19
C言語 配列の長さの上限
C言語・C++・C#
-
20
_beginthread()の使用について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
C言語 エラーの原因がわからな...
-
5
「指定されたキャストは有効で...
-
6
C言語の配列をC++のvectorに高...
-
7
エラー 添字が付けられた値が、...
-
8
整数データの配列から同じ値の...
-
9
std::set<int> で、ある値が何...
-
10
return 1L
-
11
課題なんですが・・・
-
12
acceptをalarmでタイムアウトさ...
-
13
(int *)の意味
-
14
(マルチスレッド)_beginthrea...
-
15
if と配列の組み合わせ
-
16
C++でvectorにテキストファイル...
-
17
配列変数のポインターが勝手に...
-
18
線形補間 2次元テーブル C言語...
-
19
アスタリスクでダイヤ型を作る
-
20
C言語の課題が出たのですが自力...
おすすめ情報
公式facebook
公式twitter