Как написать многопоточные функции внутри большой функции? - PullRequest
2 голосов
/ 29 мая 2020

У меня есть такая функция, которая работает нормально:

void BigFunction()
{
   void FunctionA(std::shared_ptr<ClassC> c);
}

теперь я хочу добавить еще одну функцию внутри BigFunction()

void FunctionB(std::shared_ptr<ClassC> c);

, которая также принимает std::shared_ptr<ClassC> c как вход. Как мне сделать это правильно и безопасно, чтобы обе функции FunctionA() и FunctionB() могли работать параллельно, что означает, что этим двум функциям не нужно ждать друг друга и не мешать друг другу? Спасибо.

Изменить: вот ссылка на код, который я пробовал, но не смог: https://onlinegdb.com/BJ5_BC0jI

1 Ответ

3 голосов
/ 29 мая 2020

Вы можете использовать std :: thread или std :: future / std :: asyn c. Для этих «задач» лучше / проще использовать std :: assync / future, поскольку управление потоками выполняется за вас.

bool func1(int a) {...}
bool func2(int a) {...}

void some_func()
{
    std::future<bool> f1 = std::async(std::launch::async, func1, 1);
    std::future<bool> f2 = std::async(std::launch::async, func1, 2);

    bool res1 = f1.get(); // Only need this if you care about the result
    bool res2 = f2.get(); // Only need this if you care about the result
}

Если вас не волнуют результаты, вы не Мне нужны последние две строчки. Но .get() в основном позволяет вам дождаться завершения работы ваших функций sh. Есть и другие варианты для этого ... но это довольно общий вопрос ...

Потоки и лямбды:

bool func1(int a) {...}
bool func2(int a) {...}

void some_func()
{
    std::thread t1 = []{ return func1(1); };
    std::thread t2 = []{ return func2(2); };

    // You must do this, otherwise your threads will go out of scope and std::terminate is called!
    if (t1.joinable())
    {
        t1.join()
    }
    if (t2.joinable())
    {
        t2.join()
    }

    // Or instead of joining you can detach. But this is not recommend as you lose the ability to control your thread (left commented out as an example)
    // t1.detach();
    // t2.detach();
}

Обновить

Ссылка на ваш «фиксированный» код: https://onlinegdb.com/S1hcwRAsL

Вот фрагмент кода для вашего удобства (и я не уверен, нужно ли мне сохранять изменения! В GDB онлайн! ):

int main() 
{
  std::shared_ptr<classC> c = std::make_shared<classC>();

  classB* b;
  classA* a;
  std::thread first([&b, &c]{ b->functionB(c); });
  std::thread second([&a, &c]{ a->functionA(c); });

  // synchronize threads:
  first.join();                
  second.join();               

  std::cout << "A and B completed.\n";

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