gpt4 book ai didi

c# - 像在 c# 中一样将整个类作为参数传递给线程 c++

转载 作者:行者123 更新时间:2023-11-28 01:35:26 24 4
gpt4 key购买 nike

来自 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++ 中复制这种行为,可能是非常愚蠢的事情,我发现的所有解决方案都是使用静态方法,但这首先违背了我的代码的目的。

最佳答案

你的 main 应该看起来更像这样

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));

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

关于c# - 像在 c# 中一样将整个类作为参数传递给线程 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49509687/

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