【发布时间】:2015-11-22 02:21:26
【问题描述】:
考虑以下 posix 线程代码:
void *thr(void *arg)
{
static int i = 0;
return ++i;
}
我认为这是原子且安全的操作,因为它应该在汇编指令inc i 上进行转换以更改值。但是,我不是 cpu 和多线程内部的专家,因此我对此表示怀疑。
编辑:既然不安全说我使用互斥锁来保证安全,那么在时间方面会有多少额外成本。 编辑:我从Overhead of pthread mutexes 得到了时间成本的答案。非常感谢。
【问题讨论】:
-
一般来说,如果您认为某事物是线程安全的基础是您知道编译器可能生成什么汇编代码,那么——您实际上没有根据认为它是线程安全的。因为实际上,如果你的编译器做了任何类型的优化,你永远不能真正依赖你的假设。编译器做了一些非常聪明的事情来压缩一两个周期。 (但无论如何,在您的情况下,我不确定您认为
inc i是什么。您的系统增加 register 的原语可能是原子的——但可能不是 memory location我>!) -
@ruakh 典型的 x86 CPU 具有用于增加内存位置的指令,但除非特别要求,否则它不是原子的。在这种情况下,没有理智的编译器可能会请求原子操作,因为它的成本要高得多,而且编译器没有理由认为它需要它。
-
感谢您的回答。 @DavidSchwartz 如何向编译器请求原子操作以直接增加内存中的值?
-
视情况而定。没有标准的 C/pthreads 方法可以做到这一点。您的编译器可能提供内在函数,您可以使用内联汇编,或者您可以使用提供它们的库。或者只是使用锁。
标签: c multithreading atomic