gpt4 book ai didi

c++ - 如何防止 main() 在单独的线程访问它时更改变量

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

我的程序基于启动的“世界”类(本质上“世界”包含子类“瓦片”的二维 vector ,它可以包含可以在不同瓦片之间移动以及被删除的各种变量)在主要()。 main() 处理“世界”本身的更新,而函数 updateDisplay() 在监视器上显示“世界”的内容。 updateDisplay() 由单独的 C++11 线程(在 main() 中启动)运行,并通过传递的引用访问“world”。

我的问题是我遇到了一次罕见的崩溃,因为在下面 updateDisplay() 的(简化)代码摘录中, vector world.m_grid[i][j].m_rabbit 偶尔会被 main() 清除在“if (!world.m_grid[i][j].m_rabbit.empty())”检查 updateDisplay() 之后,但在随后访问 m_rabbit[0] vector 成员之前,导致“vector 下标输出范围”错误。

for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < columns; ++j)
{

if (!world.m_grid[i][j].m_rabbit.empty())
{
s_rabbit_64.setScale(absTileScale * world.m_grid[i][j].m_rabbit[0].m_size, absTileScale * world.m_grid[i][j].m_rabbit[0].m_size);
s_rabbit_64.setPosition(x * k + (12 * absTileScale), y * (i - winFocus.y) + (12 * absTileScale));
window.draw(s_rabbit_64);
}
}
}

我的问题是,如何锁定 world.m_grid[i][j].m_rabbit vector ,以便在 updateDisplay() 线程访问它时 main() 无法更改它?我知道这是通过使用 std::mutex 实现的,但我一直无法找到一个指南来让我对此有足够的理解,以便将它应用到我的程序中。我希望这足够清楚易懂(该程序比这段摘录要大得多,我不想做大量的文本转储),请就您需要的任何要点提出澄清。

感谢您的关注。

[编辑] 拼写

最佳答案

欢迎来到狂野而毛茸茸的多线程世界。请坐;你会在这里呆很长时间。就像,你的编程生涯的其余部分有点长。它很可怕,充满了背叛和微妙的错误,而且如果你能做对的话,它的返回真的 :-)

实际上,您在识别本例中的特定错误方面做得非常好。您需要的是有一个互斥体来保护线程之间共享的所有访问和状态突变。在您的情况下:在清除 vector 之前将互斥锁锁定在主线程中,并在完成后解锁互斥锁。类似地,在访问它之前将互斥锁锁定在您的处理线程中,并在完成后将其解锁。在这种特殊情况下,您可能最终会锁定整个 double-for 循环。

This answer很好地解释了互斥锁的作用。


是的,有更快、更优雅的做事方式,但现在让我们坚持正确性。

关于c++ - 如何防止 main() 在单独的线程访问它时更改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14576055/

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