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

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

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

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

C++

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

Q&A

解決済

1回答

1820閲覧

C++ 非同期処理 std::futureの戻り値の設定方法

EXPRESS

総合スコア11

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

C++

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

0グッド

0クリップ

投稿2022/09/15 12:37

前提

あるサイトのテストプログラムを参考に非同期処理を作ったところ戻り値の設定ができません。

実現したいこと

戻り値をstd::futureでラッピングできるようにしたいです。

発生している問題・エラーメッセージ

コンパイルができないです。
下記例の場合、std::future<int> と int で合わないです。
(return 10はコンパイルが通るが、return 20 はダメ)

該当のソースコード

VC++

std::future<int> TestAsync()
{
auto n = std::async(std::launch::async, -> int
{
std::cout << "TestAsync - async tid:" << std::this_thread::get_id() << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
return 10;
});
return 20;
}

試したこと

std::futureの型を色々変えて試しましたが、コンパイルできませんでした。
TASKだと可能なので、同じようなことができるようにしたいです。
(例:Task<int> と int)

補足情報(FW/ツールのバージョンなど)

VisualStudio C++ 2017

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

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

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

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

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

EXPRESS

2022/09/15 13:43

例えばC#では public async Task<int> AccessTheWebAndDoubleAsync() { var task = AccessTheWebAsync(); int result = await task; return result * 2; } のようにintの戻り値をTask<int>でラッピングするイメージです。
guest

回答1

0

ベストアンサー

C++ ではキーワード (async) ひとつで関数を非同期化するような機能はないです。 また、制御構造と値の受け渡しは別の概念です。

std::thread を用いて新たなスレッドを生成し、スレッド間での通信に使うのが std::promisestd::future です。 ですからこれは常に組で使います。

非同期的に値 (この場合は 20) を計算して返すような場合には以下のような書き方になります。

#include <thread> #include <future> #include <iostream> void TestAsync(std::promise<int> p) { p.set_value(20); } int main() { std::promise<int> p; std::future<int> f = p.get_future(); std::thread t(TestAsync, std::move(p)); // 結果の表示 std::cout << f.get() << std::endl; t.join(); }

投稿2022/09/15 14:17

SaitoAtsushi

総合スコア5437

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

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

yohhoy

2022/09/21 06:36

C++標準ライブラリで std::async 関数が提供されるため、自前でのスレッド生成を行わない記述自体は可能です。 https://wandbox.org/permlink/KvZC6lXEmo4xkNH9 残念ながら、質問で想定されている C# Task のような柔軟な仕組みではありませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問