【发布时间】:2018-10-29 15:53:04
【问题描述】:
我读到pthread_mutex_lock() 和pthread_mutex_unlock() 都包含内存屏障。
我还读到,当你调用一个函数时,函数调用本身就充当了内存屏障。
那么在函数pthread_mutex_lock() 和pthread_mutex_unlock() 中包含内存屏障有什么意义呢?
我的意思是说我们有以下代码:
a = 5;
b = 7;
pthread_mutex_lock(&lock);
i++;
pthread_mutex_unlock(&lock);
c = 10;
无论pthread_mutex_lock() 和pthread_mutex_unlock() 是否包含内存屏障,上述代码仍然会以相同的方式执行。
【问题讨论】:
-
C 中的函数调用也涉及到sequence points,这可能是你所想的。即使调用函数,也无法明确保证一个线程对内存所做的更改对其他线程可见,这就是存在内存屏障的原因 - 以确保对内存的更改不仅在当前执行线程之外可见,而且是连贯的.
-
函数调用至多是编译器障碍,并且仅当编译器无法看到该函数内部发生的事情时(例如库调用)。互斥锁和解锁调用需要更强的保证,这可能会也可能不会导致编译器生成 CPU 屏障指令(取决于您的架构)。在
X86上,编译器屏障足以满足lock和unlock; IE。您不太可能在编译器生成的程序集中找到任何 CPU 屏障指令 -
@LWimsey 但是,如果函数调用不充当 CPU 屏障,
pthread_mutex_lock()和pthread_mutex_unlock()中的代码可能会泄露出去! -
@James 不在
X86上,正常的操作模式保证获取和释放障碍是隐含的。查看this page 了解更多详情并查找X86部分
标签: c linux multithreading pthreads