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

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

ただいまの
回答率

90.51%

  • C

    4517questions

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

  • C++

    4423questions

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

  • プログラミング言語

    752questions

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

  • C++11

    116questions

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

  • マルチスレッド

    65questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,113
退会済みユーザー

退会済みユーザー

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

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

//行列
matrix[N][5]
for(int i = 0;i < N;i++){
     //muliti_threading
     threads[i] = std::thread(thread_access,std::ref(num[i]),std::ref(matrix[i]));
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/07 19:34

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

    キャンセル

  • 2016/02/07 19:44

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

    キャンセル

+2

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

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

void thread_access(int& num, STACK* matrix)
{
  // get_five_number関数は5要素配列へのポインタを返す(?)
  // 同時に変数numの値書き換えを行っている(?)
  STACK* result = cc.get_five_number(&num);
  // 5要素をmatrix(=行列のN行目を指す)へコピー
  std::copy(result, result + 5, matrix);
}

// matrixはSTACK型の2次元配列(?)
matrix[N][5]
for(int i = 0;i < N;i++){
  // 変更点: std::ref(matrix[i]) -> matrix[i]
  //   受け取り側(thread_access)はポインタ型(STACK*)で受けるため、
  //   呼び出し側でのstd::ref()は必要ありません。
  threads[i] = std::thread(thread_access, std::ref(num[i]), matrix[i]);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C

    4517questions

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

  • C++

    4423questions

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

  • プログラミング言語

    752questions

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

  • C++11

    116questions

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

  • マルチスレッド

    65questions

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