質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

688閲覧

threadがコード3で強制終了してしまう

Anfaenger

総合スコア14

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/11/06 15:19

編集2021/11/07 10:39

タイトルの通りです。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が実行できなくなってしまうようです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/11/06 16:41

説明不足。「コード3が出て強制終了」とは何ですか? # コードは示せないのですか?
Anfaenger

2021/11/06 16:46

コードが長すぎてどこがエラー箇所か分からないのです。ただthreadをインクルードしてthread hoge(hogehoge, num); hoge.join();のように書いただけです。 デバッグするとハンドルされない例外が発生したと言われました。
episteme

2021/11/06 16:50

> ただthreadをインクルードしてthread hoge(hogehoge, num); hoge.join();のように書いただけです。 スレッドの生成に失敗してはいませんか?
episteme

2021/11/06 16:59 編集

> join()を使って実行すると join()はスレッドの"終了を待つ"ものです。 「join()を使って実行すると」とは何ですか? > デバッグするとハンドルされない例外が発生したと言われました。 その例外は関数オブジェクト(hogehoge) がthrowしたものですか? threadを使わず、hogehoge(num); でも例外が発生しますか?
Anfaenger

2021/11/06 17:10

スレッド初心者なのでjoinの認識は間違っていました。すみません。 threadを使ったときだけ発生します。
episteme

2021/11/06 17:17

スレッドの生成に失敗してはいませんか? # 生成に失敗すると thread hoge(hogehoge, num); が例外をthrowします。
Anfaenger

2021/11/06 17:47

前とスレッド作成のプログラムを変えていないので生成はできていると思うのですが…
episteme

2021/11/06 17:52 編集

"思う"だけでしょ? 実際は? そこ確認せんとラチが開かない。
Anfaenger

2021/11/06 18:00

すみません、どう確認していいものか検討すらつかないのです。
episteme

2021/11/06 18:06

...ごめんなさい、現象/症状が把握できていない質問には回答できません。 生成に失敗すると thread hoge(hogehoge, num); が例外をthrowしますから、それがcatchされるか否かで確認できるでしょうけど。
Anfaenger

2021/11/07 09:25

try catchで確認してみました。 thread作成に失敗しているようです。 構文通りに書いているのですが原因が思い当たりません。
int32_t

2021/11/07 10:12

具体的なコードなしでは具体的なアドバイスは難しいです。「あなたのコードのどこかが悪いのでしょう」ぐらいしか言えません。
matukeso

2021/11/07 10:40

デバッガでハンドルされない例外が発生したときの呼び出し履歴とか出せば、もうちょっとわかるんですが。numの確保計算式(sizeof intの掛かり方)がおかしそうなので、numの範囲外を触って死んでるとかありえそうな感じですけど。
Anfaenger

2021/11/07 10:47

numの範囲外を触っていないかも確認しましたが、そもそもnumを動的確保にしなければエラーが起こらないのでおそらく関係ないかと思われます。 メモリ不足ですかね?
退会済みユーザー

退会済みユーザー

2021/11/08 04:04

そもそも質問文のコードではコンパイルエラーです。 問題を再現できる必要最低限のコードを記述してください。
dameo

2021/11/08 06:14

とりあえず再現しないコードを書いてみました。参考までに。 #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; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問