将整个类作为参数传递给线程c ++,如c#中所示

时间:2018-03-27 09:51:19

标签: c# c++ multithreading class

来自C#我习惯于创建某个类的实例,然后调用线程在该对象上执行类方法,修改其特定变量。这是一个c#-ish例子:

class myclass
{
  public:
    int i = 0;
    void method ()
    {
      i++;
    }
}
// then my main
myclass obj1 = new myclass(); 
myclass obj2 = new myclass(); 
myclass obj3 = new myclass();
thread first = new thread (obj1.method);
thread second = new thread (obj2.method);
thread third = new thread (obj3.method);

在这里,我希望我可以访问obj1.i,obj2.i,obj3.i并且它们是= 1。 我似乎无法在C ++中复制这种行为,可能是非常愚蠢的事情,我发现解决方案是使用静态方法,但这首先打败了我的代码的目的。

2 个答案:

答案 0 :(得分:2)

你的主要看起来应该更像这个

myclass obj1;
myclass obj2;
myclass obj3;
thread first(&myclass::method, obj1);
thread second(&myclass::method, obj2);
thread third(&myclass::method, obj3);

无需使用new堆分配任何内容 要使用成员函数启动线程,可以传递指向函数和对象的指针以调用成员函数。

我们还需要确保在之后加入线程。

first.join();
second.join();
third.join();

修改

std :: thread默认按值获取参数,这意味着在上面的代码中它将复制我们的对象并在副本上运行成员函数。

如果我们想让成员函数在我们传入的实际对象上运行,我们需要像这样使用std::reference_wrapper

thread first(&myclass::method, std::ref(obj1));

有点累,我的疏忽。但现在更新了。

答案 1 :(得分:0)

我认为这段代码可以满足您的需求:

#include <string>
#include <iostream>
#include <thread>

using namespace std;

class myclass {
  public:
    myclass(int _i) {
      this->i = _i;
    }
    int i = 0;
    void method () {
      i++;
      cout << "Method " << i << "\n";
    }
};

int main()
{
  myclass obj1(1);
  myclass obj2(2);
  myclass obj3(3);

  thread t1(&myclass::method, obj1);
  thread t2(&myclass::method, obj2);
  thread t3(&myclass::method, obj3);

  //Wait for finish all threads 
  t1.join();
  t2.join();
  t3.join();
  return 0;
}