質問するログイン新規登録
C++

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

Q&A

1回答

797閲覧

std::thread の利用でdetachした複数の無限ループのスレッドをすべて終了させる方法が知りたい

samidare_chan

総合スコア18

C++

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

0グッド

1クリップ

投稿2023/10/26 12:05

編集2023/10/26 12:06

0

1

質問内容

以下の処理内容部ですが、タイトル通りでstd::thread の利用で detachした複数の無限ループのスレッドをすべて終了させる方法が知りたい が知りたいです、現状は下記のように実装しているのですが本当はどうやって実装するのでしょうか?

知りたいこと

std::thread の利用でdetachした複数の無限ループのスレッドをすべて終了させる方法が知りたい

処理内容

以下の無限ループの処理のコードなのですが、websocketを用いた無限ループして処理を受け付ける処理ですそのコードのstatsu変数を用いて、メインスレッドから終了のキー入力を受け付けるとループ処理が抜けます、その後Close()関数ではすべてのスレッドの無限ループが抜けるまで無限ループを繰り返してその後すべて終われば無限ループを抜けて処理を抜けてmain関数の処理が終了してプログラムが終了するという処理です、

クロース処理関数

cpp

1 2void Mastodon::Instance::Close() 3{ 4 for(std::map<std::string,Status>::iterator itr = status.begin(); itr != status.end(); itr++) 5 { 6 itr->second.isLoop = false; 7 } 8 9 bool isCheck = false; 10 11 while(isCheck == false) 12 { 13 bool isRestart = false; 14 for(std::map<std::string,Status>::iterator itr = status.begin(); itr != status.end(); itr++) 15 { 16 if(itr->second.isEixt == false) 17 { 18 isRestart = true; 19 break; 20 } 21 } 22 23 if(isRestart == false) 24 { 25 std::cout<<"process exit"<<std::endl; 26 ws_client.close().wait(); 27 break; 28 } 29 30 } 31// ws_client.close().wait(); 32}
websocketによる無限ループスレッド

cpp

1 2void Mastodon::Instance::Stream(std::function<void(web::websockets::client::websocket_incoming_message)> func,web::http::uri_builder uri) 3{ 4 status[uri.to_string()] = Status{false,false}; 5 if(ws_client.connect(uri.to_uri()).wait() == pplx::task_status::completed) 6 { 7 status[uri.to_string()] = Status{true,false}; 8 while(status[uri.to_string()].isLoop == true) 9 { 10 ws_client.receive().then([func](web::websockets::client::websocket_incoming_message msg) 11 { 12 if(msg.message_type() == web::websockets::client::websocket_message_type::text_message) 13 { 14 func(msg); 15 } 16 else 17 { 18 if(msg.message_type() == web::websockets::client::websocket_message_type::ping) 19 { 20 std::cout << "Ping " << msg.extract_string().get() << std::endl; 21 } 22 else 23 { 24 std::cout << "other type" << std::endl; 25 } 26 } 27 28 }).wait(); 29 } 30 } 31 status[uri.to_string()] = Status{false,true}; 32} 33

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/10/27 00:29

質問文は意味がないので読んでませんが、pthreadがnativeな環境でstd::threadのjoinの動きを見てみました。 $ cat hoge.sh cat >hoge.cpp <<EOF #include <thread> #include <chrono> #include <iostream> int main(int argc, char* argv[]) { std::thread t([]{ for(auto i = 0; i < 3; ++i) { std::this_thread::sleep_for(std::chrono::seconds(1)); std::cout << "thread running..." << std::endl; } }); if (argc > 1) { auto native_id = t.native_handle(); t.detach(); std::cout << native_id << std::endl; std::cout << (pthread_join(native_id, nullptr) == EINVAL ? "EINVAL" : "not EINVAL") << std::endl; } else { t.join(); } return 0; } EOF g++ -pthread -Wall -pedantic -g hoge.cpp -o hoge echo "join end" ./hoge echo "detach end" ./hoge 1 $ bash hoge.sh join end thread running... thread running... thread running... detach end 140420052784896 EINVAL $ detachされたスレッドはpthread_joinすら失敗するようですね。
guest

回答1

0

本件が何を問うているのかいまいちわかりませんが,「ループで激しく状態ポーリングすることに疑問がある」的な話であれば,
condition_variable を使って待ち合わせできないか?」とかそういう話を検討すればよいのかもしれません.

投稿2023/10/27 01:31

fana

総合スコア12247

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

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

samidare_chan

2023/10/27 02:27

ありがとうございます。質問ですが、無限ループという処理もおかしいのでしょうか?また終了処理の正しい書き方を知りたいです。
fana

2023/10/27 03:06

> 無限ループという処理もおかしいのでしょうか? 回答内で「ループで激しく状態ポーリングすること」と述べましたが,ループでCPUを酷使することはあまりよろしくないのではないかと. で,「CPUを酷使せずに待つ」手段があるのならばそういうのを使うことを考えれば良いのではないか,というのがこの回答の趣旨です. 「条件が達成されるまで無限に待ち続けること」が良いのか否か(例えば,予期せぬ事態を想定してタイムアウトを設けたりとかする必要性があるかどうか)はあなたが決めることです. > 正しい書き方 とかいう絶対的な正解があるわけではないでしょう. あなたが満足いくような動きをするならば,それでOKです.
fana

2023/10/27 03:14

そもそも私は std::thread を用いた経験があまり無いのですが,detach を用いた経験は全くありません. なので,「detach したやつを待つための 正しい(というか良い) やり方」みたいなのはちょっとわかんないです. ただ,「終了を待ちたいならば detach せずに join を用いれば良いのでは?」とか思います. そもそも何故 detach するのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問