• ベストアンサー

C++のシングルトンオブジェクトに対するポインタについて

C++のシングルトンオブジェクトに対するポインタについて 只今C++を勉強中(すいませんが初心者)です。 タイトルの通り、C++のシングルトンオブジェクトに対するポインタについて 調べているのですが、web、手持ちの書籍上(もちろん入門系です)では確認 できなかったので、ここで質問をさせていただいております。 シングルトンオブジェクトのアドレスを保持しているポインタを、マルチスレッド 環境で利用する場合ってどの様な動きになるのでしょうか? 例えば同時アクセスされた瞬間、オブジェクト(ポインタ)は共有されるのか、 それともキューが発生してしまうのか、が知りたいです。

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

マルチスレッド環境で利用する場合には、スレッドセーフなクラス設計を行う必要があります。 「シングルトン」を名乗るからには、異なるスレッド間でもオブジェクトは共有しなければなりません。 そうなるように、オブジェクトの生成には注意が必要です。詳しくは「Double Checked Locking Pattern」について調べてみてください。 この場合「シングルトンではこうなる」というような他力本願ではなく、 ・スレッド間で同じオブジェクト(ポインタ)を共有する ・(ほぼ)同時にアクセスした場合、先にアクセスした方がロックし、後にアクセスした側は先のアクセスが終わるまで待たされる(キューのような動作になる) ように「設計する」必要があるのです。

1chako
質問者

お礼

なるほど。 一瞬でイメージができました。 明快な回答をありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語次のステップ

    C言語について一通り勉強しました。 (入門的な本に書いてあるような事柄) 次に勉強するといいことを教えてください。 それから、入門レベルよりひとつ上の内容の書籍があれば教えてください。 ポインタ、アセンブラ、 マルチスレッド、マルチプロセス、といった ちょっと深いテーマみたいなのも教えてください。 (ここにあげたのもいまいちわかってませんが、、)

  • [参考書]洋書でオブジェクトC++

    趣味でC言語を数年やっています。 現在、C++でのオブジェクト指向でのプログラミングに着手しています。 いくつかの書籍を参考に学んでいますが、和書だけでなく洋書も読みたいと思っています。「C++でのオブジェクト指向」の入門書(洋書)でお勧めのものがありましたら教えてください。 お願いします。

  • C++におけるポインターと変数の違い

    Javaを先に学習し、現在C++を学習中の者です。 Javaでは、プリミティブ型の変数以外は変数自体にアドレスが格納されていました。 よって、例えば以下のようにオブジェクトのアドレスを共有したい場合は以下のようにする必要がありました。 String s1 = ""; String s2 = s1; これでs1をnewしない限り、変更するとs2も情報が変わるはずです。 そこで疑問に思ったのですが、C++では上記のようなことをする場合、ポインターを利用すると思っています。例えば上記のJavaと同じようなことをしたければ、以下のようにすればいいと思います(stringはchar[]のtypedefなのでちょっと違うのかもしれませんが…)。 string *s1 = new string(""); string *s2 = s1; ところで、C++では、ポインターではない変数自体は何を意味するのでしょうか? 今までの例でいうと、 string s3 = ""; このs3の事です。例えば以下のようにした場合、 string s4 = s3; s3の情報をnewせずに書き換えると、s4の情報はどうなるのでしょうか?C++でのプリミティブの場合も含めて説明していただけると幸いです。 よろしくお願いします。

  • C++かCの再選択 

    いつもお世話になっています。 c++の初心者ですが、煮詰まったので質問させてもらいます。 私はC++の入門書を理解し2~3個のコンソールプログラムを作った位のレベルです。煮詰まったのは、このままC++を勉強するかそれともCを勉強した方がいいのか迷っています。Cは知らないのでC++入門書を勉強した時、Cを勉強しているのと一緒なのですか(軽くSTL、オブジェクト志向の考え方を追加した感じ) Cのほうが文法、メモリの動きなどサンプルプログラム を作るにもクラスをつくる手間が省け簡単に書けますし 早く習得できると思うのですが。気になったのは ここの書き込みで、Cの拡張がC++とCとはC++ は異言語の意見があり、私にはわかりません。 ただ「C++がわかっていてCを知らない人はいない」との意見に納得した事もあり私の選択は間違っていた のかなと思ったのです。できればC->C++経験者と いきなりC++経験者のアドバイスが聞きたいのです。

  • オブジェクト指向プログラミング学習向けのサンプルプログラム

    「これは参考になるよ」というような、 オブジェクト指向プログラミング学習向けのサンプルプログラムを教えていただけませんか? 言語はDelphiです。 Delphiに限らず、他言語(Java、C#、C++あたり)でも結構です (移植しますので、出来ればCUI、GUIが少ないものが理想です) よろしくお願いいたします。 Delphiにてオブジェクト指向プログラミングを学んでいます。 書籍等で、基本的なことは学びました。 理解度およびスキルを上げるために、実際にプログラミングしたいと思います。 (入門書を利用してや、 自分で考えながらのテスト的なプログラミングには限界を感じてまして^^;)

  • C++とWIN32APIとゲームプログラミング

    WINDOWSで動くゲームを作りたくて3日ほど前からC++の勉強を始めました。 (最終的にはグラディウスのような横スクロールシューティングが作りたいです。) そこで質問なんですが 1、Win32APIについて調べるとC言語を使っての入門サイトばかりがヒットします。 Win32APIはC言語で書くものなんでしょうか? そうなってくると今WindowsのGUIアプリを作るのにC++を勉強していますが無駄ってことでしょうか? 例: 猫でもわかるプログラミング http://www.kumei.ne.jp/c_lang/index.html Win32API入門 http://wisdom.sakura.ne.jp/system/winapi/win32/index.html ちなみに今学習に利用しているサイトは以下のサイトです。 C++入門 http://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html 2、ポインタの概念について ポインタのイメージですが値を格納している場所みたいな感じで大方あってますでしょうか? 僕は組み込み系をやっているのでアセンブラにどっぷり漬かっています。 なんていうかレジスタの番地がポインタに該当するのかなって思っています。 ↓みたいなイメージで考えています。 ポインタ=データの場所=レジスタ番地 これであってますか? 3、まだGUIには進んでませんがウインドウのメニュー(ファイル、編集等)を作るのにリソースファイルも作るって説明が上記ページ(猫でもわかる)に書いてましたがリソーススクリプトとかヘッダーもプログラム言語とは別に勉強する必要があるんでしょうか? 4、C++のクラス概念について クラスとは複数の関数をひとまとめにしてグループ管理(おおざっぱに言うとサブルーチンの集まり的な)するようなものってイメージであってますか? 5、WindowのGUIアプリのプログラムの概要ですが各オブジェクト(ウインドウやボタン、マウスポインタ等)に対して「クリックされた」とかのアクションに対して動作するプログラムを書くって事でいいんでしょうか? 6、お勧めの参考書籍について 今までアセンブラをはじめPerlやJavaScript、C言語のお勧め入門書をいろんなサイトのレビューを見て買いましたが本よりネットの入門サイトのほうがかなり役にたってきました。それでも入門書を買うのは気持ち的に安心するからなんですが・・・ それを踏まえた上で僕の最終的な目的にあうような本があったら是非教えてください。 7、勉強の進め方や「合わせてこれも勉強しろ」っていう項目があれば教えてください。 現状としては 「C++の基礎(必要ですか?)」→「Win32API」→「DirectX」で行こうと思っています。

  • 組み込み系C言語の学習法

    私は組み込みソフトを8年やってきました。 規模としては、白物家電をイメージしてもらうと良いです。 但し、電子レンジなど表示機能がない製品が近いかもしれません。 近いものでは、洗濯機や冷蔵庫といった感じでしょうか。 マイコンは、旧三菱の740ファミリのM38000系です。 ただソフト経験(アセンブラ)はあるものの、C言語の経験は皆無なのです。 ただし、if-else, switch-case, for, while, break, continue は充分理解できます。 何故かというと、旧三菱系のマイコンには構造化アセンブラと言って、 C言語もどきの記述ができるのです。上記文のみ特別に設けられていたのです。 それを使ってソフトを作っていたので上記分は理解できるのです。 しかし、ややこしいのがポインタや構造体や共有体や配列です。 同じことをアセンブラでもやっているはずなのです。 ポインタや構造体や共有体をアセンブラで書くとどうなるかが知りたいのです。 ここの部分が書いてある書籍がないのです。 例えば、ポインタや配列は、旧三菱系で言うとXレジスタやYレジスタを 使って行っていた作業と似てるのかなと推測できます。 同じ境遇の方で克服された方がいらっしゃいましたらアドバイスをお願いします。 また、アマゾンで下記の本を見つけました。 参考になるのでしょうか? よろしくお願いします。  ""組込み現場の「C」プログラミング基礎からわかる徹底入門""

  • C++の書籍について

    今回C++を勉強するために、書籍を探しております。 書籍は沢山あるのですが、どうもピッタリという本が見つかりませんので、もしご存知でしたら教えていただけたらと思います。 で、私がどんな本を探しているかというと、 ■Windowsアプリケーションの作成が目的 ■C++の基礎が勉強できる(表示からポインタ・ファイル操作など) ■C++のGUIプログラムの作成に関する勉強ができる この条件なのですが、ちょっと私自身こだわりといいますか・・・ 作成をVC++ではなくテキストエディタで作成していきたいと考えております。 私が知っている言語で例えるなら、HTMLをホームページビルダー等を使わずテキストエディタで作成するような感じです。 インターネットをみると簡単なウィンドウを表示するプログラムの作成方法を紹介されているサイトも見かけるのですが、書籍で探すとそういったものが紹介されているものが中々ありません(地元の書店が小さいだけかもしれませんが) Windowsアプリケーションの作成にVC++は切っても切り離せないようなものなのか、あるいは、テキストエディタでは非効率的なので紹介されていないのか、それとも、入門系の本では書ききれないので、別冊や別のジャンルで紹介されているのかと、そんな気もしてしまうのですが、 もし心当たりがある、または、そんな本は無いだろう!ということがございましたら、教えていただけるとありがたいです。

  • オブジェクト指向全般、及び、クラス設計について。

    オブジェクト指向全般、クラス設計についての質問です。 当方、C#の日曜プログラマであり、数年まえから趣味のプログラミングを楽しんでおりました。 これまではあまりOOPに関する深い部分の理解をしないままなんとなくプログラミングをしてきましたが、このほど、そこらへんの理解を深めるべく名著と呼ばれる以下の書籍を買い漁って理解を深めようと模索しておりましたが、どうも、しっくりきません。 リファクタリング プログラミングの体質改善テクニック(マーチンファウラー) オブジェクト指向でなぜつくるのか(平澤章) デザインパターンとともに学ぶ オブジェクト指向のこころ(アラン・シャロウェイ) (これ以外に名前は失念してしまいましたが、UNLの書籍も読みました) それぞれの書籍を読んで「うん。なるほど。」というある程度の理解はできているつもりですが、如何せん、自分のコードで・・・となると、ちょうど作文の最初の一文が見つから無いときのような、そんな感覚に襲われてしまします。 これまでの自分のプログラミングというのは、「動けば良い」という部分が最優先であり、かつ、それのみにしかこだわって無かったことも原因としてはありそうです。 その中でも、特に戸惑ってしまうのが、「何をクラスにするのか」という最も基本的な部分です。 今習作として、2ch用ブラウザのコードを書いていますが クラス候補としていくつかのものを、確信の無い状態で挙げてはみますが ワード及び原則としての「責務」「単一責任の原則」「高凝集度」「疎結合」・・・ (それぞれの用語や原則の意味は、ある程度理解しているつもりですが) これらの用語の海で溺れてしまっている感覚で、何をクラスとすればよいのか?という部分で すでにアップアップしているような感じとなってしまいます。 また、個々のオブジェクトの関連において、あるオブジェクトを保持するのはどのオブジェクトである べきか?また、あるオブジェクトにメッセージパッシングするのはどのオブジェクトであるべきなのか?等など・・・このあたりについても、一向に頭の中の霧が晴れてくれません。 このような、悩みを解消する考え方、方法、その他おすすめの書籍でも構いませんが、ご助言いただけませんでしょうか? よろしくおねがいします。

  • オブジェクト指向のプログラミング言語の勉強法について

    オブジェクト指向のプログラミング言語の勉強法について お尋ねします。 iPhoneアプリを作ってみたいと思い、最近プログラミングの勉強を始め、C言語の入門書を一通り熟読しました。そして、次にオブジェクト指向の言語を勉強しようと思っているのですが、iPhoneアプリの開発に用いる言語は「Objective-C」で、他にも開発に使用できる言語として、「C++」や「Java」などいくつかあると聞き、どれから勉強すればいいのか迷っています。 Objective-CとC++やJavaでは、技術的(表現力?)に大きな差はあるのでしょうか?それとも、Objective-Cだけでも十分なのでしょうか? そのほか、まだC言語を勉強したばかりでわからないことが多いのですが、ゲームアプリの開発にどのような知識が必要なのか、また効率のよい学習順序、お勧めの書籍など助言を頂ければ幸いです(__) ちなみに、 ・プログラミングの経験は全くありません。 ・はじめはシューティングなど動的なゲームアプリを作ろうと思っています。 ・妥協せず、基礎からきちんと勉強したいと思っています。