gpt4 book ai didi

c++ - 多线程C++时成员变量自行改变

转载 作者:行者123 更新时间:2023-11-30 02:18:05 24 4
gpt4 key购买 nike

这是我第一次尝试对我的代码进行多线程处理。

该代码包含一个模拟类,该类创建各个模拟对象。因为我需要运行其中的几个,所以我想跨多个线程并行运行它们。该代码在串行中运行得非常好,但是当将每个模拟对象方法分配给不同的线程时,我在不同的时间(通常很早)遇到段错误,我认为这是由于某种数据竞争的发生。深入挖掘,我发现一些成员变量似乎被重新初始化或只是改变了值(并非每次运行都一致)。我很清楚某些资源会混淆,但当我在独立线程中运行每个模拟时(或者我认为如此)怎么会发生这种情况?

这是代码的简化版本。

模拟类:

   class Simulation{
public:
void run(){
//Complicated stuff;
}
};

主要.cpp:

int main(){
vector<Simulation> simulations;
vector<thread> threads;

for (int i=0; i<nSimulations; i++){
simulations.push_back(
Simulation(params));
threads.push_back(thread(&Simulation::run,
std::ref(simulations[i])));
}

for (int i=0; i<nSimulations; i++){
threads[i].join();
simulations[i].saveToFile("test.dat");
}

return 0;
}

这段代码有什么本质上的错误吗?实际代码相当复杂,所以至少我想知道这是否是将不同对象方法多线程化到不同线程的正确方法。

最佳答案

在处理 std::vector 元素的地址时,您应该非常谨慎,当您push_back 更多元素时,它们会改变。

    vector<Simulation> simulations;

for (int i=0; i<nSimulations; i++){
simulations.push_back(
Simulation(params));
threads.push_back(thread(&Simulation::run,
std::ref(simulations[i]))); // <-- This place !
}

这里将vector元素的地址保存在一个for循环中,之前的地址在vector放大时会失效。

关于c++ - 多线程C++时成员变量自行改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52700631/

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