コンピューティングにおいて、POSIX スレッド(一般にpthreadsとして知られています) は、プログラミング言語から独立して存在する実行モデルであり、並列実行モデルでもあります。これにより、プログラムは時間的に重複する複数の異なる作業フローを制御できます。各作業フローはスレッドと呼ばれ、これらのフローの作成と制御は、POSIX スレッドAPIを呼び出すことによって実現されます。POSIX スレッドは、米国電気電子学会(IEEE) 標準POSIX .1c、スレッド拡張 (IEEE Std 1003.1c-1995)で定義された API です。
API の実装は、 FreeBSD、NetBSD、OpenBSD、Linux、macOS、Android [1]、Solaris、Redox、AUTOSAR Adaptiveなど、多くのUnix系POSIX 準拠オペレーティングシステムで利用可能であり、通常はライブラリlibpthreadとしてバンドルされています。DR -DOSおよびMicrosoft Windows の実装も存在します。これは、多数の POSIX API のネイティブ実装を提供するSFU/SUAサブシステム内と、既存のWindows API上に pthreads を実装するpthreads -w32 [2]などのサードパーティパッケージ内にあります。
コンテンツ
pthreads は、 Cプログラミング言語の型、関数、定数のセットを定義します。これはpthread.h、ヘッダーとスレッドライブラリを使用して実装されます。
約 100 個のスレッド プロシージャがあり、すべてプレフィックスが付いておりpthread_、次の 5 つのグループに分類できます。
POSIXセマフォAPI は POSIX スレッドで動作しますが、スレッド標準の一部ではなく、 POSIX.1b、リアルタイム拡張 (IEEE Std 1003.1b-1993)標準で定義されています。したがって、セマフォ プロシージャにsem_は ではなく がプレフィックスとして付きますpthread_。
例
C での pthreads の使用例:
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include <pthread.h> #include <unistd.h>
#NUM_THREADS 5 を定義します
void * perform_work ( void * arguments ){ int index = * (( int * ) arguments ); int sleep_time = 1 + rand () % NUM_THREADS ; printf ( "スレッド %d: 開始しました。\n " , index ); printf ( "スレッド %d: %d 秒間スリープします。\n " , index , sleep_time ); sleep ( sleep_time ); printf ( "スレッド %d: 終了しました。\n " , index ); return NULL ; }
int main ( void ) { pthread_t threads [ NUM_THREADS ]; int thread_args [ NUM_THREADS ]; int i ; int result_code ; // すべてのスレッドを 1 つずつ作成しますfor ( i = 0 ; i < NUM_THREADS ; i ++ ) { printf ( "In main: Creating thread %d. \n " , i ); thread_args [ i ] = i ; result_code = pthread_create ( & threads [ i ], NULL , perform_work , & thread_args [ i ]); assert ( ! result_code ); }
printf ( "main: すべてのスレッドが作成されました。\n " );
//各スレッドが完了するまで待機します
for ( i = 0 ; i < NUM_THREADS ; i ++ ) { result_code = pthread_join ( threads [ i ], NULL ); assert ( ! result_code ); printf ( "メイン内: スレッド %d が終了しました。\n " , i ); }
printf ( "メインプログラムが終了しました。\n " );
return 0 ; }
このプログラムは 5 つのスレッドを作成し、各スレッドは、このスレッドの一意の番号を標準出力に出力する関数perform_workを実行します。プログラマーがスレッドが互いに通信できるようにしたい場合は、関数のスコープ外で変数を定義し、それをグローバル変数にする必要があります。このプログラムは、次のコマンドを使用してgccコンパイラーでコンパイルできます。
gcc pthreads_demo.c -pthread -o pthreads_demo
以下は、このプログラムを実行した場合に得られる可能性のある多くの出力のうちの 1 つです。
メイン: スレッド 0 を作成しています。
メイン: スレッド 1 を作成しています。
メイン: スレッド 2 を作成しています。
メイン: スレッド 3 を作成しています。
スレッド0: 開始しました。
メイン: スレッド 4 を作成しています。
スレッド 3: 開始しました。
スレッド 2: 開始しました。
スレッド 0: 3 秒間スリープします。
スレッド 1: 開始しました。
スレッド 1: 5 秒間スリープします。
スレッド 2: 4 秒間スリープします。
スレッド 4: 開始しました。
スレッド 4: 1 秒間スリープします。
メイン: すべてのスレッドが作成されました。
スレッド 3: 4 秒間スリープします。
スレッド 4: 終了しました。
スレッド 0: 終了しました。
メイン: スレッド 0 が終了しました。
スレッド 2: 終了しました。
スレッド 3: 終了しました。
スレッド 1:
終了しました。メイン: スレッド 1 が終了しました。
メイン: スレッド 2 が終了しました。
メイン: スレッド 3 が終了しました。
メイン: スレッド 4 が終了しました。
メイン プログラムは終了しました。
Windows 用 POSIX スレッド
Windows は pthreads 標準をネイティブでサポートしていないため、Pthreads4w プロジェクトは移植可能なオープンソースのラッパー実装を提供することを目指しています。また、Windows プラットフォームにほとんどまたはまったく変更を加えることなく、(pthreads を使用する) Unixソフトウェアを移植するためにも使用できます。 [4] Pthreads4w バージョン 3.0.0 [5]以降は、Apache Public License v2.0 に基づいてリリースされており、64 ビットまたは 32 ビットの Windows システムと互換性があります。LGPLv3 ライセンスに基づいてリリースされたバージョン 2.11.0 [6]も、64 ビットまたは 32 ビットと互換性があります。
Mingw -w64プロジェクトには、pthreadsのラッパー実装であるwinpthreadsも含まれており、Pthreads4wプロジェクトよりも多くのネイティブシステムコールを使用しようとします。[7]
Windows Services for UNIX/Subsystem for UNIX-based Applicationsパッケージで利用可能なInterix環境サブシステムは、pthreads APIのネイティブポートを提供します。つまり、Win32 APIにマップされているのではなく、オペレーティングシステムのsyscallインターフェイス上に直接構築されています。[8]
参照
- ランタイムシステム
- オープンMP
- シルク/シルク プラス
- スレッド ビルディング ブロック(TBB)
- ネイティブ POSIX スレッド ライブラリ(NPTL)
- DCEスレッド
- clone (Linux システムコール)
- 偽のウェイクアップ
- スレッドローカルストレージ
- GNU ポータブル スレッド
- Grand Central Dispatch (Apple のスレッド ライブラリ)
- Beginthread (新しいスレッドと Unix スレッドを作成するための Windows 内のサブルーチン)
- ステートスレッド、スレッド化に対するイベント駆動型アプローチ
参考文献
- ^ 「libc/bionic/pthread.c - platform/bionic - Google の Git」。android.googlesource.com。
- ^ 「Pthread Win-32: 標準準拠レベル」 2006-12-22。2010-06-11 にオリジナルからアーカイブ。2010-08-29に取得。
- ^ 「pthread.h(0p) — Linux マニュアルページ」 。 2022年12月18日閲覧。
- ^ Hart, Johnson M. (2004-11-21). 「オープンソース Pthreads ライブラリの実験といくつかのコメント」。2010-08-30 時点のオリジナルからアーカイブ。2010-08-29に取得。
- ^ ファイル: pthreads4w-code-v3.0.0.zip – pthreads4w v3.0.0 のソース
- ^ ファイル: pthreads4w-code-v2.11.0.zip – pthreads4w v2.11.0 のソース
- ^ 元の出典元は http://locklessinc.com/articles/pthreads_on_windows です。
- ^ 「第 1 章: Windows Services for UNIX 3.5 の概要」。2007 年 12 月 5 日。
さらに読む
- David R. Butenhof (1997)。POSIXスレッドによるプログラミング。Addison -Wesley。ISBN 978-0-201-63392-4。
- Bradford Nichols、Dick Buttlar、Jacqueline Proulx Farell (1996 年 9 月)。Pthreadsプログラミング。O'Reilly & Associates。ISBN 978-1-56592-115-3。
- Charles J. Northrup (1996-01-25)。UNIXスレッドによるプログラミング。John Wiley & Sons。ISBN 978-0-471-13751-1。
- Kay A. Robbins & Steven Robbins (2003)。UNIXシステムプログラミング。Prentice -Hall。ISBN 978-0-13-042411-2。
外部リンク
- オープン グループ ベース仕様 第 7 版、IEEE 標準 1003.1
