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

1 つのスレッドのインスタンスのみを使用する場合は、多くのインスタンスがあっても問題はありません。一貫性のない動作を引き起こす唯一の方法は、複数のスレッドで 1 つのインスタンスを使用しようとすることです。

複数のスレッドで 1 つのインスタンスを使用する場合は、mutex セマフォを使用して調査し、インスタンスが一度に 1 つのスレッドでのみ使用されていることを確認する必要があります。

于 2012-05-04T05:27:38.507 に答える
1

並列プログラミング (実際のマルチスレッドかどうかにかかわらず) は、複数の実行スレッド間で共有された変更可能なデータが存在する場合には困難です。

定義上、不変のものはすべて同期の問題なしに共有できます。

  • クラス データ: RTTI、仮想テーブル
  • 関数コード: たとえば Linux では、OS はページが書き込まれないように特別なモードでページを保護します。
  • constデータ: 文字列リテラル、宣言されたマジック ナンバー、...

したがって、並行プログラミングで心配する必要があるのは、可変データがどのように共有されるかということだけです。この共有は、次の 2 つの方法で発生する可能性があります。

  • 明示的に: 変数への参照を別の実行スレッドに渡す
  • 暗黙のうちに: 悪名高いグローバル変数、その中に静的クラス属性

プログラムにはグローバル変数がないため、共有は明示的に行われます (実行の 2 番目のスレッドを作成した場合)。

于 2012-05-04T07:04:51.073 に答える