gpt4 book ai didi

c++ - 即使在使用 std::atomic 类型后也遇到了竞争

转载 作者:太空狗 更新时间:2023-10-29 23:20:34 25 4
gpt4 key购买 nike

你能告诉我下面的代码是否是线程安全的吗?

我想我遇到了竞争条件,因为即使我从 GUI 中将 params.b 的值设置为 true,Task2 也没有执行。

struct params { 
params() {}
~params() {}
atomic_bool a;
atomic_bool b;
};

struct driver {
driver() {}
~driver() {}

params myParams;

void tFun() {
while (1) {
if (myParams.a) { /* DoTask1 */ }
if (myParams.b) { /* DoTask2 */ }
}
}

void DoSome() {
std::thread t(&driver::tFun, this);
t.detach();
while (1) {
myParams.a = fromGui.val;
myParams.b = fromGui.val;
}
}
};

int main() {
driver myDriver;
myDriver.DoSome();
return 0;
}

请执行我的 'fromGui.val' 用法,它应该表示这个值将从 GUI 加载。

最佳答案

我看到的情况是 fTun() 函数和 DoSome() 之间存在竞争:

例如:

1. DoSome() sets a,b true 
2. tFun() executes in while loop, as a is true, it starts DoTask1
2. DoSome() sets a,b to false
3. tFun() finishes DoTask1 and come to check myParams.b which is false;
DoTask2 is ignored!!
4. loop continues to step 1

如果你总是将 a,b 设置为真,那么就没有竞争可以比较,任务 DoTask1 & DoTask2 应该都被执行

关于c++ - 即使在使用 std::atomic 类型后也遇到了竞争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25540878/

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