C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C++で多数のrhreadを自動発行と同期?

[トピック内 19 記事 (1 - 19 表示)]  << 0 >>

■99934 / inTopicNo.1)  C++で多数のrhreadを自動発行と同期?
  
□投稿者/ こころな (1回)-(2022/06/23(Thu) 10:06:22)

分類:[.NET 全般] 

C++20で多量のthreadを一括発行と自動同期する方法
#1投稿記事 by こころな &#187; 0秒前
C++20規格のThread libraryを利用して、一括に多量threadを生成し、自動同期をしたいですけれども、アイディアをくださいますようお願い申し上げます。

非自動的、一般的なやりかたとして以下のようで、1000個のthreadの生成と同期をしようとしたら、少なくとも2000行のコードを書かなければなりませんね&#10083;
これを避けたいのです。

C++
// スレッド起動(関数ポインタhogeをCallableとして起動)
thread thr1(hoge, 10, 1);
thread thr2(hoge, 20, 2);
thread thr3(hoge, 30, 3);
// 1000個まで続く....

//# thNの完了を待つ
thr1.join();
thr2.join();
thr3.join();
// 1000個まで続く....
引用返信 編集キー/
■99935 / inTopicNo.2)  Re[1]: C++で多数のrhreadを自動発行と同期?
□投稿者/ kiku (269回)-(2022/06/23(Thu) 10:40:09)
No99934 (こころな さん) に返信

C++のプログラムはできませんが、要件だけわからなかったのでコメントします。

> 1000個のthreadの生成と同期をしようとしたら、

どのように同期したいのでしょうか?
提示のコードでは、スレッド1を待つ、スレッド2を待つとなっていますが
それがしたいことということでしょうか?

> 少なくとも2000行のコードを書かなければなりませんね
> これを避けたいのです。

単にコード量を減らしたいということでしょうか?
引用返信 編集キー/
■99942 / inTopicNo.3)  Re[1]: C++で多数のrhreadを自動発行と同期?
□投稿者/ radian (50回)-(2022/06/23(Thu) 11:58:46)
No99934 (こころな さん) に返信
> C++20で多量のthreadを一括発行と自動同期する方法
> #1投稿記事 by こころな &#187; 0秒前
> C++20規格のThread libraryを利用して、一括に多量threadを生成し、自動同期をしたいですけれども、アイディアをくださいますようお願い申し上げます。
>
> 非自動的、一般的なやりかたとして以下のようで、1000個のthreadの生成と同期をしようとしたら、少なくとも2000行のコードを書かなければなりませんね&#10083;
> これを避けたいのです。

https://stackoverflow.com/questions/30297465/wait-for-all-threads-in-c
ここにいくつか方法出てますね。
引用返信 編集キー/
■99945 / inTopicNo.4)  Re[2]: C++で多数のrhreadを自動発行と同期?
□投稿者/ 774RR (881回)-(2022/06/23(Thu) 14:15:52)
ここにも出てますな
https://teratail.com/questions/gcm9k4zmsfoz82

現在の PC の物理コア数は 1000 もないので、こんなバカげたことをする意味が分からない。
待つほうは for で1つづつ待てばよいっス。

引用返信 編集キー/
■99946 / inTopicNo.5)  Re[2]: C++で多数のrhreadを自動発行と同期?
□投稿者/ こころな (2回)-(2022/06/23(Thu) 14:26:34)
No99935 (kiku さん) に返信
お返信ありがとうございます。

> どのように同期したいのでしょうか?
> 単にコード量を減らしたいということでしょうか?


多量のthreadを起動、同期する場合のコード量を減らしたいのです。

引用返信 編集キー/
■99947 / inTopicNo.6)  Re[3]: C++で多数のrhreadを自動発行と同期?
□投稿者/ こころな (3回)-(2022/06/23(Thu) 14:32:18)
No99945 (774RR さん) に返信
> ここにも出てますな
> https://teratail.com/questions/gcm9k4zmsfoz82
>
> 現在の PC の物理コア数は 1000 もないので、こんなバカげたことをする意味が分からない。
> 待つほうは for で1つづつ待てばよいっス。
>

お返信ありがとうございます。

できるだけ、物理コア数を十分活かす意味で多量のthreadを発行したいわけです。
環境によって物理コア数などは違いますので、
精確に有効なthread数を計算して発行もできないので、予め「できるかぎり」の事をしかできません。
これより良いアイディアがあれば、ご教授いただきたいと思います。

引用返信 編集キー/
■99948 / inTopicNo.7)  Re[2]: C++で多数のrhreadを自動発行と同期?
□投稿者/ こころな (4回)-(2022/06/23(Thu) 14:34:37)
No99942 (radian さん) に返信
>
> https://stackoverflow.com/questions/30297465/wait-for-all-threads-in-c
> ここにいくつか方法出てますね。

貴重な情報ありがとうございます。

自分の要望と合致しているのではないかと思いますね
一つ一つ勉強させていただきます。

引用返信 編集キー/
■99949 / inTopicNo.8)  Re[3]: C++で多数のrhreadを自動発行と同期?
□投稿者/ 774RR (882回)-(2022/06/23(Thu) 14:43:21)
同時に実行できるはずのない個数のスレッドを作って全部同時投入させたら
シングルスレッドで実行するより遅くなるであろうことが見え見えなので
(排他が必要になったりすると特に)お勧めしない。


Windows だと、1スレッドにつき1つスタック領域が作られる仕様で
スタック領域サイズは 1MiByte が標準値なので 1024 個スレッドを作ると 1GiByte になる。
大富豪プログラミングっスね(10年前だと絶対に許されなかった)

引用返信 編集キー/
■99950 / inTopicNo.9)  Re[3]: C++で多数のrhreadを自動発行と同期?
□投稿者/ kiku (270回)-(2022/06/23(Thu) 16:01:10)
No99946 (こころな さん) に返信
> ■No99935 (kiku さん) に返信
> お返信ありがとうございます。
>
>>どのように同期したいのでしょうか?
>>単にコード量を減らしたいということでしょうか?
>
>
> 多量のthreadを起動、同期する場合のコード量を減らしたいのです。

回答が良くわかりませんが、
コード量を単に減らしたいのであるならば
forループで、1000回回せるように工夫すれば良いように思います。

他の方がコメントしているように、
性能は劣化することになるとは思います。
引用返信 編集キー/
■99951 / inTopicNo.10)  Re[4]: C++で多数のrhreadを自動発行と同期?
□投稿者/ こころな (5回)-(2022/06/23(Thu) 17:09:40)
No99949 (774RR さん) に返信

そうですか。なかなか難しいですね。
1000個のthreadを起動ようなloopをしないほうが良いですね。
例えば、20〜30個ぐらいは起動したいでしょう。
そのような場合でも、コンパクトなコードが必要だと思います。

さて、同じ質問が米国の掲示板に議論されていました。その中に面白そうなソリューションがありましたが、
ちんぷんかんぷん分かりません。
ヒントをいただければ幸いです。

例:

Use an atomic variable as a counter, increase the variable when launching new thread, in the thread decrease the counter once the thread is completed.
int main() {
mutex m;
condition_variable cv;
atomic<int> counter = 0;

// .... in your recursive call
// increase counter when launching thread.
counter++;
thread t([](){
// do whatever
lock_guard<mutex> lk(m);
counter--;
cv.notify_all();
});
t.detach(); // no need to join anymore.
// .... end recursive call

unique_lock<mutex> lock(m);
cv.wait(lock, [](){ return counter == 0; });
}

引用返信 編集キー/
■99952 / inTopicNo.11)  Re[5]: C++で多数のrhreadを自動発行と同期?
□投稿者/ 774RR (883回)-(2022/06/23(Thu) 18:48:42)
スレッドをいっぱい作ると速くなるぜ(キリッ
みたいに読めるんだけどスレッド数増やしたら本当に速くなるのかどうか実測してから
(2スレッドとか3スレッドとかで)手を付けても遅くないよ (YAGNI 則)
全力で間違った方向に進んでいるような気しかしないので、オイラはこの辺で退散。

引用返信 編集キー/
■99953 / inTopicNo.12)  Re[5]: C++で多数のrhreadを自動発行と同期?
□投稿者/ 伝説のカレー (20回)-(2022/06/23(Thu) 19:01:50)
No99951 (こころな さん) に返信

> さて、同じ質問が米国の掲示板に議論されていました。その中に面白そうなソリューションがありましたが、
> ちんぷんかんぷん分かりません。
> ヒントをいただければ幸いです。
>
> 例:
>
> Use an atomic variable as a counter, increase the variable when launching new thread, in the thread decrease the counter once the thread is completed.
> int main() {

私はC++がちんぷんかんぷんですが、当該コードがやろうとしてることはなんとなくわかります
スレッドを起動する前にカウントを増やしてスレッドの処理の中でカウントを減らして
カウントがゼロになるのを待つことでスレッドの処理が完了するのを待つって感じです

JavaではCountDownLatchクラスがあってそれを使うと似たようなことできます
引用返信 編集キー/
■99954 / inTopicNo.13)  Re[6]: C++で多数のrhreadを自動発行と同期?
□投稿者/ 伝説のカレー (21回)-(2022/06/23(Thu) 19:15:45)
No99953 (伝説のカレー さん) に返信

スレッドたくさん作るのは、Go言語のgoroutineのような軽量なスレッドがあるといんでしょうけどね

引用返信 編集キー/
■99955 / inTopicNo.14)  Re[7]: C++で多数のrhreadを自動発行と同期?
□投稿者/ こころな (6回)-(2022/06/23(Thu) 20:12:12)
No99954 (伝説のカレー さん) に返信
> ■No99953 (伝説のカレー さん) に返信
>
> スレッドたくさん作るのは、Go言語のgoroutineのような軽量なスレッドがあるといんでしょうけどね
>

ヒントいただきありがとうございます。

引用返信 編集キー/
■99956 / inTopicNo.15)  Re[7]: C++で多数のrhreadを自動発行と同期?
□投稿者/ こころな (7回)-(2022/06/23(Thu) 20:18:50)
774RR さま

ご指導ありがとうございます。

>(2スレッドとか3スレッドとかで)手を付けても遅くないよ (YAGNI 則)

むー、たくさんテストしかないでしょうか。

前回非常に重要な情報をいただきました:
各threadの独自のスタックメモリ発生するのですね。

これはthreadが待機状態であるかどうかに関わらず、threadの生成文を発行する時点で、必ずスタックメモリの消耗が発生するのでしょうか。

またどうぞよろしくお願いいたします。

引用返信 編集キー/
■99957 / inTopicNo.16)  Re[8]: C++で多数のrhreadを自動発行と同期?
□投稿者/ 774RR (884回)-(2022/06/24(Fri) 06:44:00)
退散するといったけどここだけ反応

> threadの生成文を発行する時点で、必ずスタックメモリの消耗が発生するのでしょうか。
Yes
というか「消耗」って言っちゃダメ。この文言だと無駄遣いって意味に見えるが、必須なものは無駄じゃない

https://dixq.net/forum/viewtopic.php?f=3&t=21433
マルチポストが嫌われる理由とか調べてみるとよし

引用返信 編集キー/
■99959 / inTopicNo.17)  Re[9]: C++で多数のrhreadを自動発行と同期?
□投稿者/ こころな (8回)-(2022/06/24(Fri) 11:05:12)
No99957 (774RR さん) に返信

ご教授ありがとうございました。

技術の話についていつも774RR さんに感服します。

ほんとうに素晴らしい方ですね。



解決済み
引用返信 編集キー/
■99961 / inTopicNo.18)  Re[10]: C++で多数のrhreadを自動発行と同期?
□投稿者/ HattariB (9回)-(2022/06/24(Fri) 18:49:23)
朝見て「帰ったらカキコしよう」と思ってたら、もう解決しちゃってたしw
はやいなぁww
引用返信 編集キー/
■100038 / inTopicNo.19)  Re[11]: C++で多数のrhreadを自動発行と同期?
□投稿者/ radian (56回)-(2022/06/30(Thu) 09:36:27)
解決済みになった後に解決済みにチェック入れずに送信すると、解決済みが解除されてしまうので注意してください。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ