如何告诉GCC变量将被多个线程修改?

时间:2011-09-15 11:12:41

标签: multithreading gcc

如何告诉GCC多个线程会修改变量? 我遇到编译器优化问题。

2 个答案:

答案 0 :(得分:1)

这是Dobbs关于volatile和threads http://drdobbs.com/cpp/184403766的相当古老的文章。这篇文章是c ++ ish,但它描述了如何使用volatile。

但是,也有一些人(包括来自英特尔)说“易失性:多线程编程几乎无用”,并说明为什么http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/他们说直接使用原子操作(“加载 - 使用 - 获取和存储释放“)和内存障碍是多线程数据共享的解决方案。

答案 1 :(得分:1)

放大上面的评论:

volatile是编译器可以在外部修改变量的提示,因此不应将该值作为优化放在寄存器中;每次引用变量时,都应从其在内存中的位置检索其值。

这很好,就目前而言,但它没有阻止涉及变量的竞争条件,其中t1和t2同时更新变量而你没有得到你期望的最终值。在这种情况下,您使用锁定以确保在修改共享变量之前对该共享变量具有独占访问权。

然而,锁定并非没有陷阱,因为你可能会陷入僵局,或者如果你不小心的话,表现相当糟糕。