- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在关于并发性和 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/
我想编写一个 SQL 查询,如果没有分配日期时间,我想替换一个可以选择所有日期和时间的字符串。 实际工作原理: SELECT * FROM `entry` WHERE `user` like
表格如下所示: | colA | colB | colC | colD |some other cols ----------------------------- |double|double| i
我有一个 C# 程序经常失败。没关系,我已经创建了程序,它是我的 child ,无论如何我都喜欢它。作为一种支持,我决定围绕它编写一个 AutoHotKey 包装器,它会自动重新启动程序,直到它没有错
我的一位同事向我展示了计算表中记录的数量,以下 View : CREATE VIEW [SPR].[TablesCount] AS SELECT s.name cSchema,
我是一名优秀的程序员,十分优秀!