CやC++についてまだよくわかっていないのですが、関数内に関数を書くと
「コンパイラ エラー C2601 ローカル関数の定義が正しくありません。」となります。
そこで以下の子スレッドのように関数を関数外に定義して、利用する変数も関数外に定義しました。
変数を外部に定義すると、メモリアクセスになるので、できるだけ避けたかったために
関数内に子スレッドを最初書いていたのですが、何か良い方法はありますか?
子スレッドの引数や戻り値を利用できればいいのですが、そんなことできるのかもわかりません。
あと、関数を配列のように定義できるのでしょうか?
test_thread_0, test_thread_1と逐一書くのが面倒です。
int sum1 = 0, sum2 = 0;
unsigned __stdcall test_thread_0(void *lpx) // lpxはおまじない?
{
// 全て足す
for (int i = ST1; i <= EN1; i++){
sum1 += Data1[i] * Data2[i];
}
return 0; // 正常という意味?
}
unsigned __stdcall test_thread_1(void *lpx)
{
// 全て引く
for (int i = ST2; i <= EN2; i++){
sum2 -= Data1[i] * Data2[i];
}
return 0;
}
No.2ベストアンサー
- 回答日時:
そもそも関数内の子関数では、スタックを親の関数と共用する前提がありますので、スレッド化することは不可能です。
スレッドは専用のスタックを持つことを覚えておいてください。スレッドは親関数である必要があり、基本的にグローバル領域のメモリかmallocやnewしたヒープ領域のメモリしか参照出来ません。
ローカル変数を受け渡すことは不可能ではないですが、スレッドが動いている間は、そのローカル変数を宣言した関数を抜けることが出来ません。関数を抜けるとローカル変数が保障されなくなるからです。これ理解できますか?
値を返す場合は、CreateThreadの第4パラメータに_biginThreadなら第3パラメータで指定されたポインタ値をスレッドに渡していますので、これを使います。
>unsigned __stdcall test_thread_0(void *lpx) // lpxはおまじない?
このlpxです。
パラメータを渡して、かつ戻り値を受け取りたいなら、lpxに渡すポインタを構造体にすれば複数のポインタを渡すことが出来るので解決できます。理解できますか?
>あと、関数を配列のように定義できるのでしょうか?
>test_thread_0, test_thread_1と逐一書くのが面倒です。
関数参照配列は作れますが、そんなに呼び出すんでしょうか?
配列にするメリットは、添え字で呼び出し関数を切り替えるプログラムを書けるアルゴリズムだった場合だけです。
あと、sum1をグローバル参照にしたくなったとのことですが、ローカル変数にlsumとかを作って計算はそこで行い。最後にsum1=lsum;とすれば解決します。
それとスレッドで参照や変更する変数は、volatile宣言を必ずしてください。
http://proger.blog10.fc2.com/blog-entry-20.html
前に紹介した「APIで学ぶWindows徹底理解」は読みましたか?中途半端な知識でスレッドをやるより、理解が早まるのでぜひ読んでくださいね。
スレッドは覚えること理解することが沢山ありますのでがんばってください!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
構造体のextern方法
-
C言語についてです 5人のテスト...
-
define で 配列
-
c言語 構造体
-
C#で構造体の配列を持った構造...
-
配列の要素数に変数を入れたい...
-
char型配列をint型に代入するには
-
fclose()でセグメンテーション違反
-
const で宣言してるのに、値が...
-
MFC - ダイアログボックスのPic...
-
DxlibのLoadgraph()を使ったsta...
-
コンボボックスでデフォルト値...
-
C言語 構造体でつまずいています
-
C言語から質問です。
-
C言語入門者です。アドレス演算...
-
C#で配列が空かを判定するには?
-
c言語
-
C言語の課題丸投げ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報