• ベストアンサー

マルチスレッドの疑問点と配列について

こんばんわ。 VC++.NET2003を用いて、C言語プログラミングを行っています。以下に質問内容をまとめます。 1.現在、マルチスレッドを行っています。マルチスレッドの注意点として、 ・スレッドが複数同時に処理(現在2スレッド)され、それぞれのスレッドで同一のグローバル変数をアクセスする。 ・各スレッドで使用しているスタティック変数はプロセスとして1つの領域に確保される。 と記述されていました。 現在、2スレッド動かしているのですが、2スレッド共通で使用したい変数がある場合は、グローバル変数として宣言してよいのでしょうか? スタティック変数というのは、 static int i を指すのでしょうか・・・・初心者的発言で申し訳ありません。 次にもう一つ質問させていただきます。 配列を整数型で10000要素、静的に用意します。 これを、memset関数ですべての番地に0を初期値として入れておきます。 たとえば、9000という数字があった場合、9000番に整数値9000を格納する。また、56では56番に56を格納する。 そして、最終的に10000要素を走査し0の場所をカウントする。 ということは可能でしょうか?もしよろしければ、サンプルを教えていただきたいと思っています。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

0のままになっている「個数」がわかればよくて、かつ 与えられる数値に重複がないという前提を置いていいなら、 配列に値をセットするときに何回目のセットかを記録するように しておけばどうでしょう? たとえば配列要素全体が100要素で、与えられた数字が15個なら、 100-15 で85個設定されていない。 与えられなかった数値にどういうものがあるのかという情報が欲しいのなら、 配列の初期化で0を埋めるのではなく、 for (i=0; i<sizeof (ary); i++) __ary[i] = i; のように番号をで初期化しておいて、その数字がきたらゼロを入れるように すれば、 for (i=0; i<sizeof (ary); i++) __if (ary[i] != 0) ____printf("%d\n", i); として、こなかった数値を列挙できると思います。 ところで、ここまできて気がついたのですが、チェック対象の数字は 正の整数だけということでよいのですよね? 配列の添え字はCでは0オリジンなので、その辺気をつけないと 一個数え間違いのエラーになりますね。

bird0214
質問者

お礼

返信ありがとうございます。 少し異なりましたが、sakusaker7のご提示していただいた方法で行いました。 ありがとうございました。

その他の回答 (2)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

> そして、最終的に10000要素を走査し0の場所をカウントする。 (Cでなく)C++でもいいなら、std::countで一行。 int n = std::count(foo, foo+10000, 0); C言語だと自分でループしながらカウントするしかないですね。

bird0214
質問者

お礼

返信ありがとうございます。 C++には大変便利な関数でしょうか?があるのですね・・・ 勉強になります。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

便宜上2つのスレッドをスレッドA、スレッドBとします。 >2スレッド共通で使用したい変数がある場合は、グローバル変数として宣言してよいのでしょうか? A、Bのスレッドのどちらからも参照したいのであればグローバル変数にするよりないでしょうね。 #クラスに閉じ込めるとかはとりあえずなしという前提で ただし、A、Bスレッドの両方ともで書き込みを行う可能性があるのなら、 書き込みが競合しないように調停してやる必要があります。 クリティカルセクションとかをキーワードに調べてみてください。 > スタティック変数というのは、 > static int i > を指すのでしょうか まあそうですね。 > 配列を整数型で10000要素、静的に用意します。 > これを、memset関数ですべての番地に0を初期値として入れておきます。 「静的に用意する」のなら、memsetで初期化するまでもなく中身がすべてゼロになることは 保証されているので0埋めの必要はありません。 > たとえば、9000という数字があった場合、9000番に整数値9000を格納する。また、56では56番に56を格納する。 > そして、最終的に10000要素を走査し0の場所をカウントする。 すみません、ここの文の意味が取れないのですが補足していただけますか? ある数字が与えられたとき、その値に対応する(56なら56番目、9000なら9000番目) 場所に値を格納するとして、 「最終的に走査する」とは? 適当な数が幾つか与えられて、それを全部配列に埋めていき、 全部がすんだら配列の中でゼロのままになっている個数を知りたい。 ということですか?

bird0214
質問者

補足

こんばんわ。 書き込みありがとうございます。 >適当な数が幾つか与えられて、それを全部配列に埋めていき、 >全部がすんだら配列の中でゼロのままになっている個数を知りたい。 >ということですか? あやふやで申し訳ありません。 sakusaker7さんのおっしゃるとおりです。 配列要素が0のままになっている個数を知りたいということです。また、0の配列要素番号=今回得られなかった値ということも導き出せそうに思ったからです。

関連するQ&A

専門家に質問してみよう