0

スレッド同期を機能させようとしています。以下は、説明用のサンプル コード (実行可能な C++ シェルの例) です。プログラムを実行すると、3 つのメンバ関数とbar1()が実行されます。ただし、私の目的は、これらの関数ごとに 1 つのスレッドを使用することです。開発環境でブースト ライブラリにアクセスできます。私はスレッドの使い方を知っており、以下の機能も実装しています。ただし、複数のスレッドが同時に同じメモリにアクセスする可能性があるため、私が理解しているようにスレッドセーフではありません。私の質問は、一度に 1 つのスレッドだけがメンバーにアクセスできるようにするにはどうすればよいかということです。ありがとうございました!bar2()bar3()ThreadedProcess()

#include <iostream>
#include <string>




   struct TestStruct {
        int nVal;
        double dVal;
        TestStruct(){}
        TestStruct(int n, double d) : nVal(n), dVal(d)
        {
        }
    };

    class Foo{

    public:

        Foo() :m_oO1(58, 17.3), m_oO2(11, 20.8), m_oO3(7, 56.3) {}

        ~Foo(){}

        void Process()
        {
            bar1();
            bar2();
            bar3();
        }

        void ThreadedProcess()
        {

            m_oThread1 = boost::thread(boost::bind(&Foo::bar1, this));
            m_oThread2 = boost::thread(boost::bind(&Foo::bar2, this));
            m_oThread3 = boost::thread(boost::bind(&Foo::bar3, this));
        }

    protected:

        TestStruct m_oO1;
        TestStruct m_oO2;
        TestStruct m_oO3;
        TestStruct m_oO4;

        boost::thread m_oThread1;
        boost::thread m_oThread2;
        boost::thread m_oThread3;

        int bar1()
        {
            int nRet = m_oO1.nVal * m_oO2.nVal;
            std::cout << nRet << std::endl;
            return nRet;
        }

        double bar2()
        {
            double dRet = m_oO2.dVal + m_oO3.dVal;
            std::cout << dRet << std::endl;
            return dRet;
        }

        double bar3()
        {
            double dRet = m_oO2.dVal * m_oO3.dVal * m_oO3.dVal;
            std::cout << dRet << std::endl;
            return dRet;
        }

    };

    int main(int /*argc*/, char** /*argv*/)
    {
        Foo myFoo;
        myFoo.Process();
        myFoo.ThreadedProcess();
    }
4

0 に答える 0