其他Boost线程中的Boost调用方法

时间:2015-08-25 23:16:14

标签: c++ multithreading boost mutex

我有一个使用Boost的线程堆栈。我有两个方法运行类,例如:

class class1 {
    public:
        class1::class1(){
            void run() { //I need to call getA
            }
        }
};

class class2 {
    private:
        float A;
    public:
        class2:class2() { A = 0; }
        void run() { A++; }
        float getA() { return A; }
};

在main函数中,我将两个run方法作为线程:

void main(){
    class1 c1;
    class2 c2;

    boost::thread t1(&class1::run,c1);
    boost::thread t1(&class2::run,c2);

    t1.join();
    t2.join();
}

我没有尝试过使用互斥锁。我还在c1中创建了一个c2指针,但该值未更新。

当一个类在其实例位于不同的线程中时,如何在另一个类中调用该方法?

1 个答案:

答案 0 :(得分:0)

首先,一些澄清:

  • 类不是C ++中的对象,它们仅仅是用于对相关内容进行分组的编译时构造。所以,"一个班级"应该是"怎么可能一个实例"或者"一个班级"。
  • 此外,"当他们的实例处于不同的线程时#34;也没有意义,因为线程(与进程相对)共享相同的内存空间。但是,你仍然需要到达另一个对象,你需要一个引用,你需要传递它。
  • 最后,在"调用其他增强线程中的[a]方法"很暧昧。它可能意味着您想要在不同的对象上调用一个方法,但该方法将由同一个线程调用。它也可能意味着您需要一个不同的线程来调用该方法,然后将结果返回给您的线程,这更复杂。这需要与其他线程进行某种形式的沟通。

现在,为了将对象传递给线程函数,请查看例如Boost.Bind。由于在线程中调用这些内容并不重要,您还可以将对class2实例的引用传递给class1的ctor并将其存储在那里。其中很大程度上取决于你真正想要的东西。但是,还有一个注释:如果您在线程之间共享对象,则必须以某种方式同步对它们的访问,例如,使用互斥锁。

PS:C ++ 11有自己的线程,我更喜欢Boost.Thread。它们大多是相同的,但其中一个是标准的,而Boost仍然是一个插件。