0

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

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

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

2 回答 2

3

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

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

于 2012-05-04T05:27:38.507 回答
1

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

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

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

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

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

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

于 2012-05-04T07:04:51.073 回答