JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

6.  创建和使用模板

7.  编译模板

8.  异常处理

9.  改善程序性能

10.  生成多线程程序

10.1 生成多线程程序

10.1.1 表明多线程编译

10.1.2 与线程和信号一起使用 C++ 支持库

10.2 在多线程程序中使用异常

10.2.1 线程取消

10.3 在线程之间共享 C++ 标准库对象

10.4 内存边界内部函数

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

10.4 内存边界内部函数

编译器提供头文件 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){}
   }
}