gpt4 book ai didi

C++ 线程 : shared memory not updated despite absence of race

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

我正在试验 C++ 标准线程。我写了一个小的基准来测试性能开销和整体吞吐量。它的原理是在一个或多个线程中运行一个 10 亿次迭代的循环,不时进行小停顿。

在第一个版本中,我在共享内存中使用了计数器(即普通变量)。我期待以下输出:

Sequential      1e+009 loops    4703 ms 212630 loops/ms
2 thrds:t1 1e+009 loops 4734 ms 211238 loops/ms
2 thrds:t2 1e+009 loops 4734 ms 211238 loops/ms
2 thrds:tt 2e+009 loops 4734 ms 422476 loops/ms
manythrd tn 1e+009 loops 7094 ms 140964 loops/ms
...
manythrd tt 6e+009 loops 7094 ms 845785 loops/ms

不幸的是,显示器显示了一些计数器,就好像它们是未初始化的一样!

我可以通过将每个计数器的最终值存储在 atomic<> 中来解决这个问题。供以后显示。但是我不明白为什么基于简单共享内存的版本不能正常工作:每个线程都使用自己的计数器,所以没有竞争条件。甚至显示线程也只有在计数线程完成后才访问计数器。使用 volatile也没有帮助。

任何人都可以向我解释这种奇怪的行为(好像内存没有更新)并告诉我是否遗漏了什么?

这里是共享变量:

const int maxthread = 6;
atomic<bool> other_finished = false;
atomic<long> acounter[maxthread];

这里是线程函数的代码:

void foo(long& count, int ic, long maxcount)   
{
count = 0;
while (count < maxcount) {
count++;
if (count % 10000000 == 0)
this_thread::sleep_for(chrono::microseconds(1));
}
other_finished = true; // atomic: announce work is finished
acounter[ic] = count; // atomic: share result
}

这里是我如何调用线程基准测试的示例:

mytimer.on();                 // second run, two threadeds
thread t1(foo, counter[0], 0, maxcount); // additional thread
foo(counter[1], 1, maxcount); // main thread
t1.join(); // wait end of additional thread
perf = mytimer.off();
display_perf("2 thrds:t1", counter[0], perf); // non atomic version of code
display_perf("2 thrds:t2", counter[1], perf);
display_perf("2 thrds:tt", counter[0] + counter[1], perf);

最佳答案

这是重现问题的简化版本:

void deep_thought(int& value) { value = 6 * 9; }

int main()
{
int answer = 42;
std::thread{deep_thought, answer).join();
return answer; // 42
}

它看起来像是将对 answer 的引用传递给 worker 函数,并将 6 * 9 分配给引用,从而分配给 answer。但是,std::thread 的构造函数复制了 answer 并将对该拷贝的引用传递给辅助函数,并且变量 answer 在主线程中永远不会改变。

GCC-4.9 和 Clang-3.5 都拒绝上面的代码,因为 worker 函数不能用左值引用调用。您可以通过使用 std::ref 传递变量来解决问题:

    std::thread{deep_thought, std::ref(answer)}.join();

关于C++ 线程 : shared memory not updated despite absence of race,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24439225/

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