当有线程时,创建类的许多实例将失败? - 单身人士模式

时间:2012-05-04 05:14:58

标签: c++ design-patterns singleton

在下面的代码中,我没有使用任何“线程”。创建多个实例仍然是个问题吗?如果我使用线程,那么由于线程共享地址空间 - 功能可能会被破坏。

当然没有“需要”来创建多个对象,但我这样做(我在这里做的方式)会有问题吗?

#include <iostream>
using namespace std;

class boiler
    {
        private:
            // Non static variables can't be initialized inside a class.
            bool boilerEmpty;
            bool mixtureBoiled;

        public:
            boiler ()
            {
                boilerEmpty    = true;
                mixtureBoiled = false;
            }
            void fillBoiler() 
            {
                if (boilerEmpty == true)
                {
                    cout << "\nFill boiler.";
                    boilerEmpty = false;
                }
            }

            void boilMixture ()
            {
                if ((boilerEmpty == false) && (mixtureBoiled == false))
                {
                    cout << "\nBoil mixture";
                    mixtureBoiled = true;
                }
            }

            void drainMixture ()
            {
                if ((boilerEmpty == false) && (mixtureBoiled == true))
                {
                    cout << "\nDrain mixture.";
                    boilerEmpty = true;
                }
            }
    };

    int main ()
    {
        boiler b, c;
        b.fillBoiler ();
        b.boilMixture ();
        b.drainMixture ();

        c.fillBoiler ();
        c.boilMixture ();
        c.drainMixture ();
    }

2 个答案:

答案 0 :(得分:3)

如果您只使用一个线程中的实例,那么拥有多个实例将导致您没有问题。邀请不一致行为的唯一方法是尝试在多个线程中使用一个实例。

如果在多个线程中使用一个实例,则需要使用互斥量信号量进行调查,以确保实例一次只在一个线程中使用。

答案 1 :(得分:1)

在多个执行线程之间存在共享可变数据的情况下,并发编程(无论是否实际多线程)具有挑战性。

根据定义,任何不可变的内容都可以在没有同步问题的情况下共享:

  • 类数据:RTTI,虚拟表
  • 功能代码:例如,在Linux上,操作系统使用特殊模式保护页面以确保它们永远不会写入
  • const数据:字符串文字,声明常量的幻数,......

因此,您应该担心并发编程的唯一问题是可变数据最终可能会被共享。这种共享可能以两种方式发生:

  • 显式:将对变量的引用传递给另一个执行线程
  • 含蓄地:臭名昭着的全局变量,其中静态类属性

在你的程序中,没有全局变量,因此共享将是显式的(如果你创建了第二个执行线程)。