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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

マルチスレッド

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

C++

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

Q&A

2回答

13338閲覧

C++ におけるスレッド間での変数渡し

退会済みユーザー

退会済みユーザー

総合スコア0

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

マルチスレッド

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

C++

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

0グッド

0クリップ

投稿2016/02/07 09:57

C++にてプログラミングをしています。
スレッド間で配列の中身をコピーしたいです.
具体的には
matrix[N][5]というメインスレッドの変数にN個のスレッドから変数を格納したいのですがうまく格納ができていない状態です.
スレッド内のget_five_number により5つの変数が代入されます
それをN回やることでメインスレッドのmatrixの中身が満たされるようにしたいです。
現在のソースではスレッド内の値は格納されているもののメインスレッドの方には値が入っていません。
どのような解決法でもいいので解決したいです。
よろしくお願いいたします。

C++

1void 2thread_access(int& num,STACK* matrix) 3{ 4 matrix = cc.get_five_number(&num); 5} 6 7//行列 8matrix[N][5] 9for(int i = 0;i < N;i++){ 10 //muliti_threading 11 threads[i] = std::thread(thread_access,std::ref(num[i]),std::ref(matrix[i])); 12}

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

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

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

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

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

guest

回答2

0

掲示コードを見る限り、マルチスレッド化以前の問題があるように見えます。まずはシングルスレッドで期待通り動くプログラムを記述すべきです。(誤解を招かぬよう;意地悪でそう言っている訳ではなく、どんな熟練者であってもマルチスレッド処理では絶対にこのステップが必要です。)

で、恐らくこんなコードを書きたいのではないでしょうか?一部はこちらで勝手に推測しています。

c++

1void thread_access(int& num, STACK* matrix) 2{ 3 // get_five_number関数は5要素配列へのポインタを返す(?) 4 // 同時に変数numの値書き換えを行っている(?) 5 STACK* result = cc.get_five_number(&num); 6 // 5要素をmatrix(=行列のN行目を指す)へコピー 7 std::copy(result, result + 5, matrix); 8} 9 10// matrixはSTACK型の2次元配列(?) 11matrix[N][5] 12for(int i = 0;i < N;i++){ 13 // 変更点: std::ref(matrix[i]) -> matrix[i] 14 // 受け取り側(thread_access)はポインタ型(STACK*)で受けるため、 15 // 呼び出し側でのstd::ref()は必要ありません。 16 threads[i] = std::thread(thread_access, std::ref(num[i]), matrix[i]); 17}

投稿2016/02/08 01:57

yohhoy

総合スコア6191

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

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

0

thread_access(int& num,STACK* matrix)
{
matrix = cc.get_five_number(&num);
}

これだと、引数で渡されたmatrixのポインタの値を書き換えているだけなので、matrix配列の中身は変化しません。

cc.get_five_numberメソッドがどのような実装なのか判りませんが、5個の値を格納した配列の先頭ポインタを返すのだと仮定すると、以下のようなコードになります。

C++

1STACK* five_number = cc.get_five_number(&num); 2for(int i = 0; i < 5; i++) 3 matrix[i] = five_number[i];

投稿2016/02/07 10:25

catsforepaw

総合スコア5938

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

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

退会済みユーザー

退会済みユーザー

2016/02/07 10:34

回答ありがとうございます. 各スレッドが1行ずつの値を担当してメインスレッドでマージしてN行5列の行列を完成させる感じの実装が必要なのでこれを関数内に書けば大丈夫なのでしょうか??
catsforepaw

2016/02/07 10:44

大丈夫かどうかと問われると、他のソースの中身を知らないのでなんともお答えしにくいのですが、少なくとも行列に何らかの値が設定されると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問