Oracle Solaris Studio 12.2:C 用户指南

3.9 内存边界内部函数

编译器提供头文件 mbarrier.h,此头文件中针对 SPARC 和 x86 处理器定义了多种内存边界内部函数。这些内部函数可在开发者使用自己的同步基元编写多线程代码时使用。建议用户参阅自己的处理器文档,以确定特殊情况下需要使用这些内部函数的时间以及是否需要使用这些内部函数。

mbarrier.h 头文件支持内存排序内部函数:

内部函数 __compiler_barrier() 出现异常的所有边界内部函数生成内存排序指令,在 x86 上这些指令是 mfencesfencelfence 指令,而在 SPARC 平台上这些指令是 membar 指令。

__compiler_barrier() 内部函数不会生成指令,但会通知编译器所有以前的内存操作必须在启动任何后续内存操作之前完成。以上操作将导致以下实际结果:所有的非本地变量和带有 static 存储类说明符的本地变量将会在边界前返回存储在内存中,然后在边界后重新下载,并且在此过程中编译器不会将边界前的操作与边界后的操作弄混。所有其他的边界均隐含 __compiler_barrier() 内部函数的行为。

例如,在以下代码中 __compiler_barrier() 内部函数的存在将阻止编译器合并两种循环:


#include "mbarrier.h"
int thread_start[16];
void start_work()
{
/* Start all threads */
   for (int i=0; i<8; i++)
   {
     thread_start[i]=1;
   }
   __compiler_barrier();
/* Wait for all threads to complete */
   for (int i=0; i<8; i++)
   {
      while (thread_start[i]==1){}
   }
}