当周围有线程时,创建类的许多实例会失败吗?- 单例模式

Creating many instances of a class will fail when there are threads around? - Singleton pattern

本文关键字:失败 实例 单例模式 许多 线程 周围 创建      更新时间:2023-10-16

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

当然,没有任何

"需要"创建多个对象,但是我这样做(我在这里所做的方式(会成为问题吗?

#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 ();
    }

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

如果在多个线程中使用一个实例,

则需要调查使用互斥锁信号量,以确保一次仅在一个线程中使用实例。

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

根据定义,任何不可变的东西都可以共享,而不会出现同步问题:

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

因此,对于并发编程,您唯一应该担心的是可变数据最终如何共享。此共享可能以两种方式发生:

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

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