如果在源平台中使用 Solaris Make,为了在 Linux 中使用 GNU Make,需要修改 makefile。要获得 Solaris Make 和 GNU Make 之间差别的详细信息,请参阅 IBM 红皮书 “AIX 5L Porting Guide” 的第 6 章。
表 6 列出了 SUN Studio C/C++ 编译器广泛使用的编译器选项,以及 GNU Compiler Collection 和 IBM XL 编译器的等同选项:
Sun Studio 选项 | GNU GCC 选项 | XL C/C++ 选项 | 说明 |
---|---|---|---|
-# | -v | -v | 指示编译器报告编译进度信息 |
-### | -### | -# | 跟踪编译,而不调用任何东西 |
-dn | -static | -qstaticlink | 指定静态链接 |
-dy | (Default) | (Default) | 指定动态链接 |
-G | -shared | -qmkshrobj | 生成共享对象,而不是生成动态链接可执行程序 |
-xmemalign | -malign-natural、 -malign-power |
-qalign | 指定最大假定内存对齐(memory alignment),以及未对齐数据访问的行为 |
-xO1、-xO2、-xO3、-xO4、-xO5 | -O、-O2、-O3 | -O、-O2、-O3、-O4、-O5 | 编译过程中在所有级别上优化代码 |
-KPIC | -fPIC | -qpic=large | 生成位置无关代码以用于共享库中(大模型) |
-Kpic | -fpic | -qpic=small | 生成位置无关代码以用于共享库中(小模型) |
-mt | -pthread | Use _r invocation mode | 编译和链接多线程代码 |
-R dirlist | -Wl、-rpath、dirlist | -Wl、-rpath、dirlist | 构建可执行文件的动态库搜索路径 |
-xarch | -mcpu、-march | -qarch、-qtune | 指定目标架构指令集合 |
XL C/C++ 编译器支持 GNU 编译器选项的一部分,从而有利于移植使用 GCC 和 g++ 编译器开发的应用程序。将 gxlc 或 gxlc++ 调用命令与 GNU 编译器选项一起使用来启用该支持。这些调用命令使用纯文本配置文件来控制 GNU-to-XL C/C++ 选项映射和默认值。您可以根据需求更改这些配置文件。参考 XL 编译器手册更多地了解 gxlc 和 gxlc++。
这一节将说明开发人员将多线程应用程序从 Solaris 迁移到 Linux 时会遇到的问题。
Solaris 支持两种线程实现:Solaris 线程和 POSIX 线程(pthreads)。有一些函数由 Solaris 线程 API 实现,而不是由 pthreads API 实现,反之亦然。对于那些符合以上情况的函数,关联的参数可能不符合。下列是仅受 Solaris 线程 API 支持的特性:
- 创建守护进程线程的能力。守护进程线程不影响进程退出状态。进程可以通过调用 exit() 退出,也可以通过让进程中的每个非守护进程线程调用 thr_exit() 来退出。
- 使用 thr_suspend() 和 thr_continue() 来暂停或继续线程执行的能力。注意 thr_suspend() 可以暂停目标线程,而不涉及线程可能拥有的锁。如果暂停线程调用某一个函数,而该函数需要已暂停的目标线程所拥有的锁,那么就会出现死锁。
- 允许线程等待进程中任何未检验出的线程终止的能力。当 thr_join() 的第一个参数设为 0 时就会这样。如果将 pthread_join() 的第一个参数设为 0,程序将因段错误而终止。
表 7 将关键 Solaris 线程函数与 pthreads 函数进行了比较。对于其他 Solaris 线程函数,请参阅 SUN 的 “Multithreaded Porting Guide”(见 参考资料)。
Solaris 线程 API | Linux POSIX 线程 API | 说明 |
---|---|---|
thr_create() | pthread_create() | 创建新的控制线程 |
thr_exit() | pthread_exit() | 终止执行调用线程 |
thr_join() | pthread_join() | 暂停调用线程,直到目标线程完成 |
thr_kill() | pthread_kill() | 向其他线程发送信号 |
thr_self() | pthread_self() | 返回调用进程的线程 ID |
thr_yield() | sched_yield() | 用其他线程替换当前线程 |
thr_getprio() | pthread_getschedparam() | 获取线程的优先级参数 |
thr_setprio() | pthread_setschedparam() | 修改线程的优先级参数 |
thr_getspecific() | pthread_getspecific() | 将新的线程特定值绑定到特定键 |
thr_setspecific() | pthread_setspecific() | 将新的线程特定值绑定到特定键 |
thr_getconcurrency() | pthread_getconcurrency() | 获取线程并发级别 |
thr_setconcurrency() | pthread_setconcurrency() | 设置线程并发级别 |
thr_sigsetmask() | pthread_sigmask() | 更改或检查调用线程的信号掩码 |
thr_keycreate() | pthread_key_create() | 创建确定线程特定数据的位置的键 |
N/A | pthread_key_delete() | 删除确定线程特定数据的位置的键 |
thr_suspend() | N/A | 暂停执行指定的线程 |
thr_continue() | N/A | 继续执行暂停的线程 |
fork1() | fork() | 常规分支 |
forkall() | N/A | 复制所有分支 |
在 Solaris 9 及其更早的版本中,fork() 的行为与 POSIX 线程中 fork() 的行为不同。在 POSIX 线程中,fork() 创建新的进程,复制子进程中的全部地址空间。不过,它只复制子进程中的调用线程。Solaris 线程 API 还提供复制所有分支语义的 forkall()。该函数复制子进程中的地址空间和所有线程。POSIX 线程标准不支持这个特性。
有一些 POSIX 线程例程在 Solaris 中可以实现,但在 Linux 中却无法实现,反之亦然。表 8 列出了这些例程:
例程 | Solaris | Linux |
---|---|---|
pthread_cond_reltimedwait_np | y | n |
pthread_mutexattr_getrobust_np | y | n |
pthread_mutexattr_setrobust_np | y | n |
pthread_mutex_consistent_np | y | n |
pthread_mutex_reltimedlock_np | y | n |
pthread_rwlock_reltimedrdlock_np | y | n |
pthread_rwlock_reltimedwrlock_np | y | n |
pthread_attr_getaffinity_np | n | y |
pthread_attr_setaffinity_np | n | y |
pthread_cleanup_pop_restore_np | n | y |
pthread_cleanup_push_defer_np | n
时间:2009-10-19 21:24
来源:developworks
作者:developworks
原文链接
好文,顶一下
(1)
100%
文章真差,踩一下
(0)
0%
------分隔线----------------------------
把开源带在你的身边-精美linux小纪念品
|