2009-10-23 78 views
0

我在执行一些关键速度多线程代码。如果我确实知道某些基本的写入操作是原子性的,我可以避免出现一些关键部分。我刚刚阅读了一篇学术论文,其中我看到以下内容:运行时间检测 - 原子操作

“基本类型大小为t,int,float和pointer的写入必须是原子的。一个线程的写入必须由其他线程以相同的顺序看到。用于大多数现代标准计算机的IA-32和Intel-64 CPU架构保证了这些假设。“

我想这样做是为了能够在运行时的处理器是否是一种类型,这些操作都是原子的检测。 - 我想这也适用于AMD处理器。

+1

AMD处理器支持IA32 CPU架构,并且它们限定从中Intel64位来源的AMD64构建筑系统。 – MSalters 2009-10-23 10:20:25

+0

有趣。想知道什么是论文,以及在编译器优化时如何保证。如果你正在谈论组装好,我相信。否则,我发现很难吞下。 – 2009-10-23 18:54:54

+0

这里的纸: www.cs.ualberta.ca/~mmueller/ps/enzenberger-mueller-acg12.pdf 我不知道你所说的“你想怎么在编译器的优化存在出示担保”的意思。谁说我想要? – Mick 2009-10-27 10:13:27

回答

2

这听起来是多余的。 .EXE可能只是int main() { return true; }。无论它运行,而答案是正确的,或者操作系统无法运行.EXE在所有的因为...处理器类型不匹配.EXE类型。

+0

但我可以制作两个不同的版本 - 一个是关键部分,另一个是没有的部分。我想在快速测试中加入测试,以便能够正常退出而不是崩溃或产生错误的答案。 – Mick 2009-10-23 09:42:58

+1

不需要。只需使用'InterlockedIncrementAcquire',它可以在任何地方使用最快的算法。即使在伊坦尼克。 – MSalters 2009-10-23 10:15:22

+0

InterlockedIncrementAcquire是特定于Win32的。 – alexkr 2009-10-23 11:45:46

1

我知道这是题外话,但如果你打算写锁免费代码,您应该definatly由Herb萨特从文章阅读第一Lock-Free Code: A False Sense of Security

报价:

无锁码具有两大缺陷 的缺点。首先,它不是广义的 用于解决典型的 问题 - 很多基本数据结构,甚至双向链表, 仍然没有已知的无锁 实现。提出一个新的 或改进的无锁数据结构 仍然会赚你在一个审过的杂志, 有时学位至少 发表的论文。

1

为了避免陷入这些CPU /平台的具体问题,你可以考虑:

等待的std ::在C++ 0x中标准原子(已经可用于GCC)

使用Intel TBB

使用ACE_Atomic_Op