Kaz*_*Kaz 13
请查看POSIX规范的4.11节.
应用程序应确保限制多个控制线程(线程或进程)对任何内存位置的访问,以便没有控制线程可以读取或修改内存位置,而另一个控制线程可能正在修改它.使用同步线程执行的函数以及相对于其他线程同步内存来限制这种访问.[强调我的]
然后给出了一个函数列表,它们可以同步内存,还有一些额外的注释.
如果在某些体系结构上需要内存屏障指令,则必须使用这些指令.
关于compare_and_swap:那不是POSIX; 查看文档以了解您使用的任何内容.例如,IBM 为AIX 5.3 定义了一个compare_and_swap函数. 没有完整的内存屏障语义文档说明说:
如果compare_and_swap用作锁定原语,则在任何关键部分的开头插入isync.
从这个文档我们可以猜测IBM compare_and_swap有发布语义:因为文档不需要关键部分结束的障碍.获取处理器需要发出异步以确保它不读取陈旧数据,但发布处理器不必执行任何操作.
在指令级别,某些处理器已经与某些同步保证进行比较和交换,而有些则没有.
Max*_*kin 12
pthread_mutex_lock和pthread_mutex_unlock函数是否调用内存栅栏/屏障指令?
他们这样做,以及线程创建.
但请注意,存在两种类型的内存障碍:编译器和硬件.
编译器障碍仅阻止编译器重新排序读取和写入以及推测变量值,但不会阻止CPU重新排序.
硬件障碍阻止CPU重新排序读取和写入.全内存栅栏通常是最慢的指令,大多数时候您只需要具有获取和释放语义的操作(实现自旋锁和互斥锁).
使用多线程,您在大多数时间都需要两个障碍.
其定义在此转换单元中不可用(并且不是内在的)的任何函数都是编译器内存屏障.pthread_mutex_lock,pthread_mutex_unlock,pthread_create也发出一个硬件内存屏障,以防止CPU重新排序的读取和写入.
有关更多详细信息,请参阅C++和2012年之后:Herb Sutter - atomic <> Weapons.
| 归档时间: |
|
| 查看次数: |
5027 次 |
| 最近记录: |