面向对象的C ++多线程

时间:2012-02-13 16:48:18

标签: c++ multithreading c++11

我已经开始在c ++ 0x中使用一些基本的线程来加快速度。对于一个除了测试速度之外什么都不做的简单例子:

void my_thread_func(int n, int steps, int offset)
{
  double a[n];
  for (int i=0; i<n; i++)
    a[i] = i + offset;
   for (int step=0; step<steps; step++)
     for (int i=0; i<n; i++)
       a[i] = sin(a[i]);
}

int main()
{
   std::vector<std::thread> t;
   for (int i=0; i<numRuns; i++)
     t.push_back(std::thread(my_thread_func, n, steps, i));
   for (int i=0; i<numRuns; i++)
     t[i].join();
}

这很有效。我的问题有点笼统,即如何将上述想法概括为与成员函数一起使用。假设我有10个Rope(s),每根绳子有几个(单线程)成员函数,computeTorques(),computeForces()等。假设Rope(s)不共享内​​存/资源,有没有办法我可以多线程调用每个Rope的每个成员函数而无需显式更改Rope中的(单线程)代码吗?

2 个答案:

答案 0 :(得分:3)

使用std::bind

class Rope
{
    ...
    void compute();
};

int main()
{
   Rope ropes[10];
   std::vector<std::thread> t;

   for(auto& r : ropes)
      t.push_back(std::thread(std::bind(&Rope::compute, &r)));

   for(auto& th : t)
     th.join();
}

编辑:使用lambda会更好。

   for(auto& r : ropes)
      t.push_back(std::thread([&]{ r.compute(); }));

答案 1 :(得分:0)

它完全取决于对象的实现。

对于某些物体,这是安全的,对于其他可能有麻烦的物体。