タイトルの通りです。Visual StudioのC++でthreadのjoin()を使って実行するとコード3が出て強制終了してしまいます。
前まで使えていたのが急に使えなくなったので原因が分からず途方に暮れています。
どなたかご教示お願い致します。
原因と思われるプログラムの一部です。
C++
1~~~ 2#include <thread> 3using namespace std; 4 5void hogehoge(int a, int b){ 6 //処理 7} 8 9int main(void){ 10 int* num; 11 num = (int)malloc(sizeof(int) * 30 * 30 * 4 + 50 * 50 * 3); 12 thread hoge(hogehoge, a, b); // ここでハンドルされない例外が起こる 13 hoge.join(); 14} 15 16~~~
追記
mallocでint型で30304+50503の領域を確保しているとthreadが実行できなくなってしまうようです。
説明不足。「コード3が出て強制終了」とは何ですか?
# コードは示せないのですか?
コードが長すぎてどこがエラー箇所か分からないのです。ただthreadをインクルードしてthread hoge(hogehoge, num); hoge.join();のように書いただけです。
デバッグするとハンドルされない例外が発生したと言われました。
> ただthreadをインクルードしてthread hoge(hogehoge, num); hoge.join();のように書いただけです。
スレッドの生成に失敗してはいませんか?
> join()を使って実行すると
join()はスレッドの"終了を待つ"ものです。 「join()を使って実行すると」とは何ですか?
> デバッグするとハンドルされない例外が発生したと言われました。
その例外は関数オブジェクト(hogehoge) がthrowしたものですか?
threadを使わず、hogehoge(num); でも例外が発生しますか?
スレッド初心者なのでjoinの認識は間違っていました。すみません。
threadを使ったときだけ発生します。
スレッドの生成に失敗してはいませんか?
# 生成に失敗すると thread hoge(hogehoge, num); が例外をthrowします。
前とスレッド作成のプログラムを変えていないので生成はできていると思うのですが…
"思う"だけでしょ? 実際は? そこ確認せんとラチが開かない。
すみません、どう確認していいものか検討すらつかないのです。
...ごめんなさい、現象/症状が把握できていない質問には回答できません。
生成に失敗すると thread hoge(hogehoge, num); が例外をthrowしますから、それがcatchされるか否かで確認できるでしょうけど。
try catchで確認してみました。
thread作成に失敗しているようです。
構文通りに書いているのですが原因が思い当たりません。
具体的なコードなしでは具体的なアドバイスは難しいです。「あなたのコードのどこかが悪いのでしょう」ぐらいしか言えません。
デバッガでハンドルされない例外が発生したときの呼び出し履歴とか出せば、もうちょっとわかるんですが。numの確保計算式(sizeof intの掛かり方)がおかしそうなので、numの範囲外を触って死んでるとかありえそうな感じですけど。
numの範囲外を触っていないかも確認しましたが、そもそもnumを動的確保にしなければエラーが起こらないのでおそらく関係ないかと思われます。
メモリ不足ですかね?
そもそも質問文のコードではコンパイルエラーです。
問題を再現できる必要最低限のコードを記述してください。
とりあえず再現しないコードを書いてみました。参考までに。
#include <thread>
#include <iostream>
#include <functional>
#include <list>
using namespace std;
void hogehoge(int a, int b) {
cout << a << endl;
cout << b << endl;
}
struct dummy {
void hogehoge(int a, int b) { ::hogehoge(a, b); }
};
void start(list<thread>& threads) {
cout << "thread is starting..." << endl;
// 関数呼び出し
threads.emplace_back(
hogehoge,
1,
2);
// (インスタンス)メンバ関数(bind使用)呼び出し
dummy d;
using namespace placeholders;
threads.emplace_back(
bind(&dummy::hogehoge, d, _1, _2),
3,
4);
// (インスタンス)メンバ関数(lambda使用)呼び出し
threads.emplace_back(
[=](int a, int b) mutable { // 参照にする場合は生存期間に注意
d.hogehoge(a, b);
},
5,
6);
cout << "thread started" << endl;
}
int main(void) {
list<thread> threads;
try {
start(threads);
while (threads.size()) {
auto i = threads.begin();
i->join();
threads.erase(i);
}
cout << "thread is finished" << endl;
// アクセス違反(0xC0000005)で落ちる(system_errorではない)コード
threads.emplace_back(static_cast<void(*)()>(nullptr));
}
catch (const system_error& e) {
// スレッド起動処理に失敗した場合
cerr << e.what() << endl;
}
return 0;
}
あなたの回答
tips
プレビュー