gpt4 book ai didi

c++11 线程不修改相同的值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:17 27 4
gpt4 key购买 nike

我正在编写一个(理想情况下)需要两个线程同时运行的程序。

我有一个全局 vector 变量 myObjects 来跟踪我的对象:

vector<Object> myObjects;

还有一个 MoND 类型的对象,它将承担繁重的工作。它使用 vector 作为参数进行初始化,并将“对象”插入 vector 。到目前为止没问题。

MoND  mySim =  MoND(myObjects);

在 main 中,需要使用 myObjects 作为参数调用 mySim 的方法。在我用于测试的非线程版本中,这有效(在 100 次迭代后运行 bails):

int main(int argc, char** argv) {
...
mySim.Run(myObjects);// Run simulation on Objects
glutMainLoop(); // Enter the event-processing loop
return 0;
}

我所说的工作是指更改存储在 myObjects 中的 Object 的属性。这需要持续并发运行,因此并不理想。

使用线程:

int main(int argc, char** argv) {
...
thread t1(&MoND::Run, mySim, myObjects);// Run simulation on Objects
glutMainLoop(); // Enter the event-processing loop
return 0;
}

这没有达到预期的效果。Run() 接收 myObjects 并更改它们的值,但这些值不会转换为主线程使用的 myObjects。是否在内存中为新线程创建了另一个 myObjects 实例?(是的,我确实通过引用传递并且非线程版本确实更新了值)

所以我知道逻辑是有效的(一切都按预期工作,没有线程)。我曾尝试使用原子,但老实说,我无法让它与 vector 或其内容一起使用。

如何强制两个线程在内存中的 myObjects 的同一个实例上工作(即让它们共享变量)?

几点:

  • 不,我不担心线程安全,因为只有一个线程写入,另一个线程只读取(读/写顺序不重要)

  • Run() 通过方法 SetPos(args..)SetVel(args. .)

最佳答案

std::thread 构造函数复制其参数以确保它们在被操作时仍然存在。

为避免这种情况,您可以使用 std::ref :

thread t1(&MoND::Run, mySim, std::ref(myObjects));

在这里,您 promise 会照顾对象的生命周期。

std::bindstd::async 出于相同的原因表现出相同的行为。

请注意 mySim 也被复制,但是如果不想复制,您也可以在这里传递一个指针。

关于c++11 线程不修改相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24191835/

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