torutkのブログ

ソフトウェア・エンジニアのブログ

Solaris 10でのマルチスレッドプログラム

既存のSolarisプログラムのSolaris10対応の調査で、マルチスレッドライブラリのデファインとリンクを確認していました。

SolarisスレッドとPOSIXスレッドの使い分けについて

「マルチスレッドのプログラミング」(文書番号819-0390-12 2008/10版)

http://dlc.sun.com/pdf/819-0390/819-0390.pdf
Sun(Oracle)の資料で、POSIXスレッド(一部Solarisスレッドあり)を使ったマルチスレッドプログラミングについて詳しく書かれています。この第8章 コンパイルデバッグ によると、

  • mtを使用した場合は、SolarisスレッドのAPIが自動的にリンクされます。-lthreadを明示的に指定する代わりに、常に-mtオプションを指定してください。pthreadを使用するには、リンクのコマンド行で-mtオプションと-lpthreadオプションを指定します。libpthreadライブラリによってlibthreadへのインタフェースが提供されるため、pthreadを使用する場合もlibthreadが引き続き必要です。

とあります。ただし、Solaris10については、

Solaris 10リリースでは、すべてのスレッド関数がlibcライブラリに含まれているため、明示的にlibthreadまたはlibpthreadライブラリにリンクする必要はありません。

ともあります。

一方、資料の古い版で言及されていた、_POSIX_C_SOURCEと_REENTRANTのデファインについては、一切言及がなくなっています。

例えば、同文書の2003年8月版では、以下のように言及があります。

POSIX動作を望む場合は、-D_POSIX_C_SOURCEフラグで199506L以上の値を指定してアプリケーションをコンパイルしてください。Solaris動作を望む場合は、-D_REENTRANTフラグを指定してマルチスレッドプログラムをコンパイルしてください。これは、アプリケーションのすべてのモジュールに当てはまります。

Oracle Solaris Studio 12.2: C++ User's Guide」(文書番号821-1383 2010/09版)

Oracleの資料で、Sun C++コンパイラ(現名称Solaris Studio、前名称Sun Studio、前々名称Sun ONE Studio、前々々名称Forte Developer、前々々々名称Sun Workshop)のマニュアルです。

マルチスレッドライブラリについて言及している箇所を引用(拙訳)します。

マルチスレッドアプリケーションをビルドする場合、あるいはマルチスレッドライブラリをリンクする場合、プログラムのコンパイルおよびリンク時に-mtオプションを指定します。このオプションにより、プリプロセッサに-D_REENTRANTを指定し、ld(リンカー)に正しい順番で-lthreadを指定します。(略)標準モードでは、-mtオプションはlibCより前にlibthreadがリンクされることを保証します。

疑問

  • Solaris10において、POSIXスレッドを使ったプログラムをコンパイル・リンクする場合に指定するオプションはなにか?
    • -mtオプションさえ指定すれば、POSIXスレッドの関数が使えるようになります。が、_REENTRANTがデファインされることでいいのか疑問が残ります。

似たようなことを調べていた人