gpt4 book ai didi

c++ - 如何在一个大函数内编写多线程函数?

转载 作者:行者123 更新时间:2023-12-01 14:42:46 26 4
gpt4 key购买 nike

我有一个这样的功能,可以正常工作:

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

最佳答案

您可以使用std::thread或std::future/std::async。对于这些“任务”,最好使用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()基本上允许您等待函数完成。还有其他选择可以执行此操作...但是这是一个非常普遍的问题...

线程和lambda的:
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;
}

关于c++ - 如何在一个大函数内编写多线程函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62092242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com