объектно-ориентированная многопоточность C ++ - PullRequest
2 голосов
/ 13 февраля 2012

Я начал использовать некоторые базовые потоки в 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 веревок, и каждая веревка имеет несколько (однопоточных) функций-членов, computeTorques (), computeForces () и т. Д. Предполагая, что веревки не разделяют память / ресурсы, есть ли способМожет ли многопоточность вызывать каждую функцию-член каждой веревки без явного изменения (однопоточного) кода внутри веревки?

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

Использование 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();
}

РЕДАКТИРОВАНИЕ: лучше использовать лямбду.

   for(auto& r : ropes)
      t.push_back(std::thread([&]{ r.compute(); }));
0 голосов
/ 13 февраля 2012

Это полностью зависит от реализации вашего объекта.

Для некоторых объектов это будет безопасно, для других могут возникнуть проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...