【问题标题】:Why do pthread_mutex_lock() and pthread_mutex_unlock() contain memory barriers if the function calls themselves act as memory barriers? [duplicate]如果函数调用自己充当内存屏障,为什么 pthread_mutex_lock() 和 pthread_mutex_unlock() 包含内存屏障? [复制]
【发布时间】: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 上,编译器屏障足以满足lockunlock; IE。您不太可能在编译器生成的程序集中找到任何 CPU 屏障指令
  • @LWimsey 但是,如果函数调用不充当 CPU 屏障,pthread_mutex_lock()pthread_mutex_unlock() 中的代码可能会泄露出去!
  • @James 不在X86 上,正常的操作模式保证获取和释放障碍是隐含的。查看this page 了解更多详情并查找X86 部分

标签: c linux multithreading pthreads


【解决方案1】:

内存屏障只是告诉您,它确保您可以控制是否可以访问代码的某些部分(澄清一下:代码操作内存)。

如果您的意思是函数 pthread_barrier_wait() : 有一个小的区别。如果您只是调用 mutex_lock,则必须等到该互斥锁解锁,然后才能继续。

使用屏障,您将不得不等待所需的线程数在“屏障”上调用“等待”。

phtread1-------é[..........blocked]-------

phtread2----é[.............blocked]-------

pthread3--------------------------é-------

澄清我在上面所做的:é 是对屏障的调用,'-' 是程序执行时,'.' 是程序执行时。就是你在等待的时候。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 2014-02-04
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
相关资源
最近更新 更多