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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

並列処理

複数の計算が同時に実行される手法

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Q&A

解決済

2回答

893閲覧

C++で複数のタスクを並列実行する方法

TOMO6181

総合スコア39

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

並列処理

複数の計算が同時に実行される手法

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

0グッド

0クリップ

投稿2019/03/25 13:17

C#で作成したマルチタスクの処理をC++で実装しようとしています。
まず、C#では以下のコードを実装しています。

C#

1namespace TaskArray 2{ 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 int[] a = { 1, 2, 3, 4}; 8 int[] b = { 2, 3, 4, 5 }; 9 int[] ans = new int[4]; 10 11 Task[] taskArray = new Task[4]; 12 13 for (int i = 0; i < 4; i++) 14 { 15 // コンストラクタの第二引数に渡した値は、コンストラクタ定義時に入れた値がStart時に入る 16 taskArray[i] = new Task(obj => AddCalc(a[(int)obj], b[(int)obj], ref ans[(int)obj]), i); 17 taskArray[i].Start(); 18 } 19 20 Task.WaitAll(taskArray); 21 22 for (int j = 0; j < 4; j++) 23 { 24 Console.WriteLine(ans[j]); 25 } 26 27 Console.ReadKey(); 28 } 29 30 static void AddCalc(int a, int b, ref int c) 31 { 32 c = a + b; 33 } 34 35 } 36}

上記の結果では、aとbの各要素が足されて「3,5,7,9」が出力されます。

これをC++で以下のように実装しようとしたのですが、「auto型はトップレベルの配列型では設定できません」、
「外側の関数のローカル変数は、キャプチャリストに含まれていない限り、lambd本体で参照できません。」
のビルドエラーが発生してしまいます。
原因、解決方法が分かる方がおられましたら宜しくお願い致します。

C++

1using namespace concurrency; 2using namespace std; 3 4int _tmain(int argc, _TCHAR* argv[]) 5{ 6 int a[] = { 1, 2, 3, 4}; 7 int b[] = {2, 3, 4, 5 }; 8 int ans[4]; 9 10 auto t[4]; 11 12 for (int i = 0; i < 4; i++) 13 { 14 t[i] = create_task([]() { AddCalc(a[i], b[i], &ans[i]); }); 15 } 16 17 for (int i = 0; i < 4; i++) 18 { 19 t[i].then([]{}).wait(); 20 } 21 22 return 0; 23} 24 25// 加算 26void AddCalc(int a, int b, int* c) 27{ 28 *c = a + b; 29}

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

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

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

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

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

guest

回答2

0

ベストアンサー

マニュアル首っ引きでやってみた。

C++

1#include <ppltasks.h> 2#include <iostream> 3 4using namespace concurrency; 5using namespace std; 6 7void AddCalc(int a, int b, int* c) { 8 *c = a + b; 9} 10 11int main() { 12 int a[] = { 1, 2, 3, 4 }; 13 int b[] = { 2, 3, 4, 5 }; 14 int ans[4]; 15 16 task<void> t[4]; 17 18 for (int i = 0; i < 4; i++) { 19 t[i] = create_task([&,i]() { AddCalc(a[i], b[i], &ans[i]); }); 20 } 21 22 for (int i = 0; i < 4; i++) { 23 t[i].wait(); 24 cout << ans[i] << ' '; 25 } 26 cout << endl; 27}

投稿2019/03/25 14:21

episteme

総合スコア16614

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

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

TOMO6181

2019/03/25 15:02

create_taskからthread、transformに関する方法まで御回答までありがとうございます。 お教えして頂いた方法で想定していたコード、動作を実現することができました。
guest

0

PPLはよくわかってないんで 標準C++スレッドサポートライブラリを使って:

C++

1#include <thread> 2#include <iostream> 3 4void AddCalc(int a, int b, int* c) { 5 *c = a + b; 6} 7 8int main() { 9 int a[] = { 1, 2, 3, 4 }; 10 int b[] = { 2, 3, 4, 5 }; 11 int ans[4]; 12 13 std::thread t[4]; 14 15 for (int i = 0; i < 4; i++) { 16 t[i] = std::thread(AddCalc, a[i], b[i], &ans[i]); 17 } 18 19 for (int i = 0; i < 4; i++) { 20 t[i].join(); 21 std::cout << ans[i] << ' '; 22 } 23 std::cout << std::endl; 24}

[追記] 別解: 並列アルゴリズム版:

C++

1#include <execution> 2#include <algorithm> 3#include <iostream> 4 5int main() { 6 int a[] = { 1, 2, 3, 4 }; 7 int b[] = { 2, 3, 4, 5 }; 8 int ans[4]; 9 10 std::transform(std::execution::par, a, a+4, b, ans, [](int x, int y) { return x+y;}); 11 12 for (int i = 0; i < 4; i++) { 13 std::cout << ans[i] << ' '; 14 } 15 std::cout << std::endl; 16}

投稿2019/03/25 13:34

編集2019/03/25 14:01
episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問