gpt4 book ai didi

c++ - 为什么将条件写入转换为无条件写入不是线程安全优化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:28:52 26 4
gpt4 key购买 nike

在关于并发性和 C++11 内存模型的演讲中,Herb Sutter 给出了非法优化的示例。

http://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Herb-Sutter-atomic-Weapons-2-of-2

第 17 分钟的幻灯片:

void f(vector<widget>& v) {
if(v.length()>0) xMutex.lock();
for(int i = 0; i < v.length(); ++i)
++x; // write is conditional
if(v.length()>0) xMutex.unlock();
}

“很可能(如果有严重缺陷的话)中央循环的转变:”

r1 = x;
for(int i = 0; i < v.length(); ++i)
++r1; // oops: write is not conditional
x = r1;

他解释说,“......这个写入不是有条件的,即使 doOptionalWork 为假,它也会在每次执行时发生,这将注入(inject)不受互斥锁保护的写入,注入(inject)竞争......”

他为什么说发明的写入不受互斥锁保护?我理解下面描述的完整转换。

// "optimized" version 1
void f(vector<widget>& v) {
if(v.length() > 0) xMutex.lock()
r1 = x;
for(int i = 0; i < v.length(); ++i)
++r1;
x = r1;
if(v.length() > 0) xMutex.unlock();
}

但也可能是这个。

// "optimized" version 2
void f(vector<widget>& v) {
if(v.length() > 0) xMutex.lock()
r1 = x;
for(int i = 0; i < v.length(); ++i)
++r1;
if(v.length() > 0) xMutex.unlock();
x = r1;
}

显然版本 2 不是线程安全的,但我不确定版本 1。版本 1 线程安全吗?如果在游戏中没有其他写入 x 的行怎么办?

刚才我开始输入“要么 v.length() 为 0 要么它不是...”并意识到在多线程世界中即使是重言式也会让我失望。我不知道我可以从哪里开始对此进行推理。

最佳答案

只有当 vector 内部有东西时才使用互斥量。在两个空 vector 上同时运行此方法会导致数据竞争,因为我们根本没有锁定,但我们写入了 x。

关于c++ - 为什么将条件写入转换为无条件写入不是线程安全优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24479803/

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