Java Solaris 加入Sun中国技术社区 我的社区 注册说明
 
ISV Online
 
用Sun Studio11开发多线程应用程序
 
By Iris.Zhu@Sun.COM, 1/8/07  

前言

Sun Studio11的多线程库、强大的debug工具和编译器优化等特性,非常适合多线程应用的开发。本文结合实例对如何利用Sun Studio11提供的集成开发环境进行多线程应用的开发、编 译和调试进行介绍。如果需要进一步了解多线程编程技术,请参考 多线程编程手册

Sun Studio11

简介

Sun Studio11软件是Sun最新和最好的针对C,C++和Fortran应用程序的开发工具套装。它为公司程序员和ISV们提供针对基于Sun平台的企业应用程序的开发、调试、配 置分析和性能分析的综合集成的工具套装。 最新版本Sun Studio11具备多种新特性,使得在Solaris操作系统上开发高性能应用程序更为容易。它 为在最新的UltraSPARC,x64和基于x86平台的多core处理器的平台上开发 32位和64位应用程序提供了丰富而高效的环境。此外,Sun Studio 11软件提供了通用的调试工具,能 以可视的方式调试单线程或多线程的C,C++和Fortran代码。所有这些强大的工具都建立在一个基于 NetBeans的集成开发环境中。Sun Studio 11软件也为Linux操作系统提供了一个集成的开发环境(IDE),性能分析工具和直观的调试程序。

下载和安装 

Sun Studio11目前已经免费。在Sun Developer Network(SDN)免费注册后,从 http://developers.sun.com/sunstudio/downloads下载到适合不同平台运行的版本
  • 用于Solaris SPARC版
  • 用于Solaris x86/x64版
  • 用于Linux x86/x64版

目前,Sun Studio已经成为Solaris Enterprise System套件中的一部分,也可以通过下载该套件获得该软件。

 安装实例 

本文中涉及的操作在Sun Ultra40 WorkStation(x64)硬件平台、Sun Solaris 10 操作系统上进行。首先,下载Sun Studio11后解压缩并安装。Sun Studio11软件会自动安装到系统路径/opt/SUNWspro下。

安装完毕, 设置环境变量PATH和MANPATH的路径。

启动画面。

SunStudio11开发环境

Sun Studio为开发者提供了丰富的工具和功能强大的集成开发环境(IDE)。开发人员可以利用Sun Studio进行应用程序的编码、编译,代码管理,自动生成Makefile等。更 详细的内容请参考Sun Studio IDE中的使用手册或Sun Developer Network(SDN)网站Sun Studio主题。

Sun Studio IDE(1)

Sun Studio IDE(2)

Sun Studio 11 新特点

Sun Studio11包含了很多有用的开发工具,比如:

  • 优化的C,C++,Fortran编译器,比如c编译器cc,C++编译器CC
  • 命令行和GUI调试工具dbx
  • 运行时内存检查工具RTC(Real Time Check)
  • 性能分析工具Analyzer
  • 分布式Build工具dmake
  • 经过优化的高性能函数库
  • 更多类库如Rogue Wave Tools.h++,SCL,STLport库
  • 图形开发工具X-Designer GUI Builder
  • Java本地接口JNI等

Sun Studio11还包含专门针对多线程应用开发的工具LockLint。LockLint 对锁的使用情况执行静态分析,发现锁使用发生不一致时,LockLint 会检测数据争用(data race)和死锁(deadlock)的最常见原因:访问共享变量时没有保持适当的锁。

在后面的介绍中,我们将通过实际的例子介绍如何在Sun Studio11提供的集成开发环境中开发多线程应用程序。

多线程应用的开发

2005年11月14日,Sun公司在美国旧金山宣布,最终产品名称确定为UltraSPARC T1的“Niagara”处理器芯片正式问世,这款芯片集成8 个内核,每个内核能同时运行4个线程。在 这类硬件平台上运行,要充分发挥其性能优势,采用多线程技术编写的应用程序具备更高的扩展性和并发性。Sun Studio产品包含的编译器提供了-xchip=ultraT1,- xtarget=ultraT1编译选项特别针对将在“Niagara”处理器上运行的程序进行优化。迄今为止,经过Sun Studio11编译的应用在Sun公司硬件平台上运行,性能测试取得了不俗的成绩。比 如经Sun Studio11编译的测试程序在基于UltraSPARCIV+芯片的Sun Fire6900上运行获得SPECint_rate2000 Performance最高奖。

除了采用软件和硬件的多线程技术,还可以利用OpenMP接口编程。用OpenMP接口可以控制代码在执行时多线程并发进行,适合在多处理器平台上使用以提高CPU的利用率。目前Sun Studio11软件支持最新的OpenMPv2.5应用程序编程接口,可以指定-xopenmp进行编译。

总之,Sun Studio11提供的C/C++/Fortran编译器支持更多选项,同时提供了功能强大的debug工具和性能分析工具,可以帮助多线程应用程序结合最新的CMT技术,在 UltraSPARC,x86以及基于x64的系统中发挥最大的优势。

下面通过一个简单的多线程程序演示如何使用Sun Studio11的IDE进行编码、编译和调试。并结合实例对Sun Studio提供的多线程锁分析工具Locklint进行了介绍。

实例分析

样例程序使用POSIX thread,可以 点击这里获得。a 下载后改名为sample.c

创建文件并进行编辑

点击桌面上的快捷键进入Sun Studio IDE。也可以在终端使用命令行:

$sunstudio


如果希望在IDE 环境中编写代码,可以选择[Create Files]-> 选择文件类型和生成路径。建立模板后可以编辑源代码。


编译

Sun Studio提供的cc 编译器可以进行[Create Files]-[Makefile], 然后选择文件生成的路径、类型、编译选项以及连接库等,下图略去了几个步骤,详细请参考IDE 中的帮助菜单。

选择路径


选择Makefile类型

中间略去一些步骤,生成完毕前最终确认


或选择已经存在的Makefile进行编译,选择[Build]-[Make]


命令行编译命令:

源代码:sample.c

可执行文件名:a.out

编译命令:

$cc -lmt -g sample.c -o a.out -lpthread

调试

在IDE环境中加载可执行程序并利用dbx进行调试。选择[Debug]-[Load Program]

加载可执行程序


开始调试

可以直接用鼠标在代码窗口中设置断点,然后利用图形界面中的各种button进行控制。Sun Studio11的IDE环境提供多个功能窗口。在不同的窗口可以观察到各线程局部变量、函数调用栈、各线程状态和正在执行的操作。

样例程序运行后生成3条线程,可以在窗口中选择任意线程进行调试。IDE左侧窗口显示线程数、局部变量、已设断点,右侧上方窗口显示代码,右 下角窗口显示鼠标操作的调试动作对应的dbx命令,也可以在这一区域手动输入调试命令。

Threads画面显示所有线程状态


Call Stack显示线程2函数调用栈


检测线程

多线程应用执行时,进程包含的各线程共享地址空间和其他资源。为了实现不同线程对共享资源的安全访问,开发人员经常会用到多线程锁 (pthread_mutex)或者状态变量(pthread_cond)实现互斥。Sun Studio提供了工具LockLint,可以检测静态代码中潜在的同步错误、死锁和数据争用。L ockLint工具可以在Sun Studio11 SPARC版得到,目前只支持对c语言程序的检测,未来将会有新版本支持C++语言程序。

LockLint 工作流程


功能

LockLint 主要功能是报告锁使用状况,可以发现 代码中使用的不一致用法,识别引起竞争条件和死锁的许多原因。 其中 Analyze 子命令可以生成包含以下内容的详细报告:

  • 使用锁会对那些函数产生影响的提示信息。

  • 锁的申请和释放前后不一致的警告信息。

  • 锁使用的范围不当导致可能发生数据争用的警告信息。

  • 全局变量没有恰当的锁保护可能导致数据争用的警告信息。

  • 申请或释放锁的顺序不当导致死锁的警告信息。

  • 申请线程锁时由于别的原因,如互斥锁等待某一特定的状态变量(condition variable)导致申请失败的警告信息。。

  • 在代码分析过程中发现的各种与锁和断言关联的问题。

实例

源程序 sample-deadlock.c 包含一段 锁处理,使用LockLint 进行静态分析。

Thread1 Thread2

get b_mutext;

if(success)

then release a_mutex;

get a_mutex;

if (success)

then release b_mutex;

编译

使用编译标志-Zll生成LockLint可以识别的带有.ll后缀的文件。

$ cc -mt -g -Zll sample-deadlock.c -o deadlock.ll -lpthread

使用LockLint 工具检测

这里只列出简单的步骤,更多内容请参照 在线手册。本 操作在/bin/sh环境中进行。

  1. 生成环境变量$LL_CONTEXT

    $ lock_lint start

  2. 进入lock_lint session,加载.ll文件

    $ lock_lint load deadlock.ll

  3. 通过子命令进行检测,比如对函数funca中的锁a_mutex进行断言

    $ lock_lint assert side effect a_mutex acquired in funca

    生成报告,点击这里获取 报告内容

    $ lock_lint analyze -h >>report-assert.txt

  4. 或者直接生成分析报告。在报告中含有线程锁的使用状况,比如发生死锁的位置和函数等。点击这里获取 报告。< /p>

    $ lock_lint analyze -h >>report-deadlock.txt

  5. 确认报告

    报告中详细描述了各线程互斥锁使用状况,发生死锁函数-funca() funcb() ,以及对两线程死锁提出了警告。

  6. 退出lock_lint的运行

    $ exit

参考

多线程编程及代码实例

http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html

使用dbx 调试多线程程序

http://developers.sun.com/sunstudio/articles/multithreaded.html

Sun Studio 使用手册集

http://docs.sun.com/app/docs/coll/1199.3

LockLint 及使用方法

http://developers.sun.com/sunstudio/articles/locklint.html

  关于作者

Iris Zhu是Sun Microsystems公司MDE部门的工程师,主要对北京及日本地区在Solaris平台上进行开发或部署的ISV提供技术支持,帮助ISV完成移植和性能调优。