gpt4 book ai didi

c++ - 尽量减少每次迭代时对原子的检查

转载 作者:行者123 更新时间:2023-11-27 23:47:21 27 4
gpt4 key购买 nike

从多线程的角度来看,以下是正确的还是错误的?

我有一个有 2 个线程的应用程序:主线程和工作线程。

主线程有一个在连续循环中调用的 MainUpdate() 函数。作为其工作的一部分,MainUpdate() 函数可能会在工作线程上运行的工作对象上调用 ToggleActive() 方法。 ToggleActive() 方法用于打开/关闭工作对象。

流程是这样的。

// MainThread
while(true) {
MainUpdate(...);
}

void MainUpdate(...) {
for(auto& obj: objectsInWorkerThread) {
if (foo())
obj.ToggleActive(getBool());
}
}

// Worker thread example worker ------------------------------
struct SomeWorkerObject {

void Execute(...) {
if(mIsActive == false) // %%%%%%% THIS!
return;
Update(...);
}

void ToggleActive(bool active) {
mIsActiveAtom = active; // %%%%%%% THIS!
mIsActive = mIsActiveAtom; // %%%%%%% THIS!
}

private:
void Update(...) {...}

std::atomic_bool mIsActiveAtom = true;
volatile bool mIsActive = true;
};

我试图避免在每次调用 Execute() 时检查原子字段,它会在工作线程的每次迭代中被调用。同一时间有多个工作对象在运行,因此会有很多原子字段检查。

如您所见,我正在使用非原子字段来检查 liveness 。非原子字段的值从 ToggleActive() 中的原子字段获取其值。

根据我的测试,这似乎可行,但我感觉它不正确。

最佳答案

volatile变量只保证它没有被编译器优化和重新排序,与多线程执行无关。因此,自 ToggleActive 起,您的程序确实存在竞争条件。和 Execute可以修改/阅读mIsActive同时。

关于性能,您可以检查您的平台是否支持无锁原子 bool 。如果是这样的话,检查原子值会非常快。我记得在某处看到一个基准显示 std::atomic<bool>volatile bool 具有相同的速度.

关于c++ - 尽量减少每次迭代时对原子的检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49525329/

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