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

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

新規登録して質問してみよう
ただいま回答率
85.48%
プログラミング言語

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

マルチスレッド

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

C++

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

Q&A

解決済

4回答

8792閲覧

マルチプログラミングでのグローバル変数について

退会済みユーザー

退会済みユーザー

総合スコア0

プログラミング言語

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

マルチスレッド

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

C++

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

0グッド

0クリップ

投稿2015/08/30 10:07

C++でのプログラミングについて質問があります
サーバプログラムを作成しておりますが, 受信の部分を多重化しております
さらにヘッダファイルよりグローバル変数を定義しておりこの配列にたいして非常に重い処理をさせています(高頻度の値の書き込みや読み込みです)

多重化の部分にforkをもちいてマルチプロセスにしているので各プロセスではメモリが独立しているのでグローバル変数は異なって使用できると考えていましたが実際に実行してみると値が異なってしまうことがあります
この原因とはなんなのでしょうか?
ちなみにグローバル変数は要素数10000程度の構造体配列です

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

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

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

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

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

guest

回答4

0

上でさんざん書かれていますが、プロセス間で変数を共有するには、共有メモリを利用する必要があります。
既に使っていて、おかしいのであれば、同期処理ができていないのではないでしょうか。

プロセス間の同期は、ファイルロックの機能を使ったり、名前付きのミューテックスやセマフォを使ったり、いろいろな手段が用意されているのですが、BUGを作り込みやすい部分でもあるので、そのあたりを見直してみてはいかがでしょうか。

投稿2015/08/31 10:20

shanxia

総合スコア1038

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

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

0

ご質問の内容だけだと情報が少なすぎてなんとも回答しようがないのですが、あえて推測するとすれば

サーバプログラムを作成しておりますが, 受信の部分を多重化しております

ということから、通信を本来受信すべきプロセスではない別のプロセスで受信してしまっているためではないか、ということが考えられます。
プログラムの作りが確実時に決まった相手と通信できるようになっているか確認されてはいかがでしょうか(実際の作りを知らないまま推測で書いていますので見当違いだったらご容赦ください)。

投稿2015/08/30 11:56

KoichiSugiyama

総合スコア3041

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

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

0

参考までに、forkした後にグローバル変数が独立なのかを確認するコードを書いてみました。
https://paiza.io/projects/J3m49Y1zgCo_nVfV0lTfMg
fork前にグローバル変数を書き換えていて、それを考慮していないとかでは無いでしょうか?独立になるのはforkした瞬間であり、その前までは共通で利用され、親プロセスの全てが子プロセスにそのままコピーされます。

投稿2015/08/30 11:53

raccy

総合スコア21735

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

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

退会済みユーザー

退会済みユーザー

2015/08/30 15:16

回答ありがとうございます 今回はpre forkという手法を用いていまして、多重化をあらかじめしている形になります。 このような場合ですとあらかじめforkを行なっているためメモリは完全な独立だと考えていました... わざわざソースコードまでありがとうございます、今一度見直してみます
guest

0

ベストアンサー

質問の肝心な部分の日本語が曖昧です。

マルチプロセスにしているので各プロセスではメモリが独立している

これは正しいですね。

グローバル変数は異なって使用できると考えていましたが

なにが異なってもどう使用できるという意味でしょうか?
プロセスが異なるとグローバル変数といえども異なります。
プロセス間で変数を共有したければ、OSの共有メモリの機能を使ってください。

実際に実行してみると値が異なってしまう

どう異なるのでしょうか?

マルチプロセスの質問なのに、「マルチスレッド」のタグが付いているのも気になります。両者の区別は付いていますでしょうか?

投稿2015/08/30 10:47

otn

総合スコア84505

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

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

退会済みユーザー

退会済みユーザー

2015/08/30 11:14

解答ありがとうございます 言葉足らずで失礼いたしました、プロセスがことなった場合のグローバル変数の参照するメモリが異なるはずなのにそれらのプロセスを同時に処理すると処理の結果が単一プロセスの場合とことなってしまって、どこがおかしいのか、もしや知識が間違っていたのかということを知りたかったため質問いたしました。 ちなみにマルチスレッドをタグに設定したのはマルチプロセスのタグがなかったのでマルチスレッドの知見をお持ちの方ならマルチプロセスの知識もお持ちだろうとのことでタグをつけました
otn

2015/08/30 12:12

今ひとつ状況が分かりませんが、プロセスが異なるとメモリ空間は独立という理解は間違っていませんので、問題があるとすると他の原因でしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問