gpt4 book ai didi

c++ - 并行执行不会更新我的变量

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

我想编写一个程序,其中将创建随机数,我将追踪其中最大的一个。两个线程将并行运行。但是,我的 best 变量停留在其初始变量。为什么?

[编辑]

我在 Joachim 的回答后更新了代码,但我并没有在每次运行时都得到正确的答案!我错过了什么?

#include <iostream>       // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex
#include <random>

std::default_random_engine generator((unsigned int)time(0));
int random(int n) {
std::uniform_int_distribution<int> distribution(0, n);
return distribution(generator);
}

std::mutex mtx; // mutex for critical section

void update_cur_best(int& cur_best, int a, int b) {
// critical section (exclusive access to std::cout signaled by locking mtx):
mtx.lock();
if(a > b)
cur_best = a;
else
cur_best = b;
mtx.unlock();
}

void run(int max, int& best) {
for(int i = 0; i < 15; ++i) {
int a = random(max); int b = random(max);
update_cur_best(best, a, b);
mtx.lock();
std::cout << "|" << a << "| |" << b << "|" << std::endl;
mtx.unlock();
}
}

int main ()
{
int best = 0;
std::thread th1 (run, 100, std::ref(best));
std::thread th2 (run, 100, std::ref(best));

th1.join();
th2.join();

std::cout << "best = " << best << std::endl;

return 0;
}

示例输出:

|4| |21|
|80| |75|
|93| |95|
|4| |28|
|52| |92|
|96| |12|
|83| |8|
|4| |33|
|28| |35|
|59| |52|
|20| |73|
|60| |96|
|61| |34|
|67| |79|
|67| |95|
|54| |57|
|20| |75|
|40| |30|
|16| |32|
|25| |100|
|33| |36|
|69| |26|
|94| |46|
|15| |57|
|50| |68|
|9| |56|
|46| |70|
|65| |65|
|76| |73|
|16| |29|
best = 29

我得到 29,这不是最大值!

最佳答案

作为更新问题的答案,在 update_cur_best 中,每次迭代都会覆盖 best 的值。最后,它的值将只是最近生成的 a, b 对中的较大者。你想要做的是仅在当前 ab 大于 best 时更新它(我不确定你为什么生成两个每次迭代的随机值...)

关于c++ - 并行执行不会更新我的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25712206/

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