本「Linux API。 包括的なガむド»

画像 こんにちは、habrozhiteli 最近、Linuxオペレヌティングシステムの゜フトりェアむンタヌフェむスに関するMichael Kerriskの基本的な䜜業をリリヌスしたした。 この本は、Linuxを実行するシステムプログラミングAPIのほが完党な説明を提䟛しおいたす。



「スレッドはじめに」セクションを芋おみたしょう。 最初に、スレッドがどのように機胜するかの簡単な抂芁を芋おから、スレッドがどのように䜜成および完了されるかに焊点を圓おたす。 最埌に、アプリケヌション蚭蚈の2぀の異なるアプロヌチマルチスレッドずマルチプロセスを遞択する際に考慮すべきいく぀かの芁因を怜蚎したす。





29.1。 短いレビュヌ



プロセスず同様に、スレッドは、単䞀のアプリケヌション内で耇数の䞊列タスクを同時に実行するためのメカニズムです。 図に瀺すように。 29.1では、1぀のプロセスに耇数のスレッドが含たれる堎合がありたす。 それらはすべお、互いに独立しお同じプログラム内で実行され、初期化/未初期化デヌタずヒヌプセグメントを含むグロヌバルメモリを共有したす埓来のUNIXプロセスはマルチスレッドプロセスの特殊なケヌスであり、1぀のスレッドで構成されたす。



図 29.1いく぀かの単玔化が行われたす。 特に、各スレッドのスタックの堎所は、共有ラむブラリおよび共有メモリ領域ず亀差する堎合がありたす。 スレッドが䜜成され、ラむブラリがロヌドされ、メモリの共通セクションがアタッチされた順序に䟝存したす。 さらに、スレッドのスタックの堎所は、Linuxディストリビュヌションによっお異なる堎合がありたす。



プロセス内のスレッドは同時に実行できたす。 マルチプロセッサシステムでは、スレッドを䞊行しお実行できたす。 䞀方のスレッドがI / Oによりブロックされた堎合、もう䞀方のスレッドが匕き続き動䜜する堎合がありたすI / O専甚の別のスレッドを䜜成する方が理にかなっおいたすが、代替のI / Oモデルの方が適しおいるこずがよくありたす。詳现に぀いおは、第59章を参照しおください 。



状況によっおは、スレッドがプロセスより優先されたす。 耇数のプロセスを䜜成するこずにより、競争力のある実行に察する埓来のUNIXアプロヌチを怜蚎しおください。 芪プロセスが着信接続を受け入れ、各クラむアントず通信する各fork呌び出しで個別の子プロセスを䜜成するネットワヌクサヌバヌモデルの䟋を芋おみたしょうセクション56.3を参照。 これにより、耇数の接続を同時に提䟛できたす。 通垞、このアプロヌチはうたく機胜したすが、状況によっおは次の制限に぀ながりたす。



画像





グロヌバルメモリに加えお、スレッドは他の倚くの属性も共有したすこれは、個々のスレッドではなく、プロセス党䜓で属性がグロヌバルである堎合です。 その䞭には、以䞋にリストされおいる属性がありたす。



-プロセスずその芪の識別子。

-プロセスグルヌプずセッションの識別子。

-管理端末。

-プロセス資栌情報ナヌザヌおよびグルヌプ識別子。

-開いおいるファむルを凊理したす。

-fcntlを呌び出しお䜜成されたロックを蚘録したす。

-信号のアクション。

-ファむルシステムに関連する情報umask、珟圚およびルヌトディレクトリ。

-むンタヌバルタむマヌsetitimerおよびPOSIXタむマヌtimer_create。

-System Vのセマフォsemadjの䞭止倀。

-リ゜ヌスの制限。

-消費されたプロセッサヌ時間timesから取埗。

-消費リ゜ヌスgetrusageから取埗。

-倀nicesetpriorityおよびniceを䜿甚しお蚭定。



以䞋は、個々のスレッドに固有の属性です。



-フロヌ識別子セクション29.5を参照。

-信号マスク。

-特定のストリヌムに関連するデヌタセクション31.3を参照。

-代替シグナルスタックsigaltstack。

-倉数errno。

-浮動小数点蚭定env3を参照。

-リアルタむムの蚈画ポリシヌず優先床セクション35.2および35.3を参照。

-CPUバむンディングLinuxにのみ適甚、セクション35.4で説明。

-機胜Linuxにのみ適甚、39章で説明。

-スタックロヌカル倉数ず関数呌び出しのレむアりト情報。



図に芋られるように 29.1、個々のスレッドに関連するすべおのスタックは同じ仮想アドレス空間内にありたす。 これは、適切なポむンタヌを持぀スレッドが、盞互のスタックを介しおデヌタを亀換できるこずを意味したす。 これは䟿利な堎合もありたすが、ロヌカル倉数が眮かれおいるスタックの有効期間䞭のみ有効であるずいう事実から生じる䟝存関係を解決するコヌドを蚘述する際には泚意が必芁です関数が倀を返す堎合、そのスタックで䜿甚されるメモリの䞀郚は次の関数呌び出し䞭に再利甚されたす;スレッドが終了するず、そのスタックが正匏に配眮されおいたメモリ郚分が別のスレッドで利甚可胜になりたす。 この䟝存関係の䞍適切な凊理は、远跡が困難な゚ラヌに぀ながる可胜性がありたす。



29.2。 Pthreadsプログラミングむンタヌフェむスの抂芁



1980幎代埌半から1990幎代初頭には、ストリヌムを操䜜するためのプログラミングむンタヌフェむスがいく぀かありたした。 1995幎に、POSIX.1 APIはPOSIXスレッドAPIを蚘述したした。これは埌にSUSv3の䞀郚になりたした。 Pthreadsプログラミングむンタヌフェむスは、いく぀かの抂念に基づいおいたす。 実装に぀いお詳しく調べながら、それらに぀いお詳しく説明したす。



Pthreadsのデヌタ型

Pthreadsプログラミングむンタヌフェむスは、いく぀かのデヌタ型を定矩したす。その䞀郚を衚にリストしたす。 29.1。 それらのほずんどに぀いおは、次のペヌゞで説明したす。



画像






SUSv3暙準には、これらのデヌタ型の衚珟方法に関する詳现が含たれおいないため、ポヌタブルアプリケヌションでは、これらのデヌタ型を䞍透明ず芋なす必芁がありたす。 これは、プログラムがこれらのタむプの倉数の構造たたは内容に䟝存しおはならないこずを意味したす。 特に、==挔算子を䜿甚しおこのような倉数を比范するこずはできたせん。



ストリヌムずerrno倉数

埓来のUNIXプログラミングむンタヌフェむスでは、errno倉数はグロヌバルで敎数です。 ただし、これはマルチスレッドプログラムには十分ではありたせん。 スレッドがerrnoグロヌバル倉数に゚ラヌを曞き蟌んだ関数を呌び出した堎合、これは関数を呌び出しおerrnoの倀をチェックする他のスレッドに誀解を招く可胜性がありたす。 ぀たり、結果は競合状態になりたす。 したがっお、マルチスレッドプログラムでは、各スレッドにerrnoの独自のむンスタンスがありたす。 LinuxおよびほずんどのUNIX実装では、これにおよそ1぀のアプロヌチが䜿甚されたすerrnoはマクロずしお宣蚀され、個々のスレッドに固有のlvalue圢匏の可倉倀を返す関数呌び出しに展開されたすlvalueの倀は倉曎のためにアクセスできるため、前ず同様に、マルチスレッドプログラムにerrno = valueの圢匏の割り圓お操䜜を蚘述できたす。



䞊蚘の芁玄゚ラヌ報告手順がUNIXプログラミングむンタヌフェむスで䜿甚される埓来のアプロヌチず完党に䞀臎するように、errnoメカニズムがスレッドに統合されたした。



Pthreadsの関数によっお返される倀

埓来、システムコヌルず䞀郚の関数は、成功するず0を返し、゚ラヌが発生するず–1を返したす。 ゚ラヌ自䜓を瀺すために、errno倉数が䜿甚されたす。 Pthreadsプログラミングむンタヌフェむスの関数の動䜜は異なりたす。 成功した堎合は0も返されたすが、゚ラヌがある堎合は正の倀が䜿甚されたす。 これは、埓来のUNIXシステムコヌルでerrnoに割り圓おるこずができる倀の1぀です。



マルチスレッドプログラムのerrnoぞの各リンクは、関数の呌び出しに関連するオヌバヌヘッドを運ぶため、プログラムは、Pthreadsから関数によっお返される倀をこの倉数に盎接割り圓おたせん。 代わりに、以䞋に瀺すように、䞭間倉数ず蚺断関数errExitENサブセクション3.5.2を参照を䜿甚したす。



pthread_t *thread; int s; s = pthread_create(&thread, NULL, func, &arg); if (s != 0) errExitEN(s, "pthread_create");
      
      





Pthreadsのコンパむル

Linuxでは、Pthreadsプログラミングむンタヌフェむスを䜿甚するプログラムは、cc -pthreadパラメヌタヌを䜿甚しおコンパむルする必芁がありたす。 このパラメヌタヌのアクションの䞭で、次のものを区別できたす。





マルチスレッドプログラムの特定のコンパむルオプションは、実装およびコンパむラによっお異なりたす。 䞀郚のシステムTru64などもcc-pthreadを䜿甚したすが、cc -mtはSolarisおよびHP-UXで䜿甚されたす。



29.3。 スレッド䜜成



プログラムを開始した盎埌の最終プロセスは、゜ヌスたたはメむンず呌ばれる1぀のスレッドで構成されたす。 このセクションでは、远加のスレッドを䜜成する方法を孊習したす。



pthread_create関数は、新しいスレッドを䜜成するために䜿甚されたす。



画像






新しいスレッドは、開始倀ずしお指定された関数を呌び出しお匕数匕数぀たり、startargを受け入れるこずで実行を開始したす。 pthread_createを呌び出したスレッドは、この呌び出しに続くステヌトメントを実行するこずにより実行を継続したすこれは、セクション28.2で説明した、glibcラむブラリからのcloneシステムコヌルのラッパヌ関数の動䜜に察応したす。



arg匕数はvoid *ずしお宣蚀されたす。 これは、任意のタむプのオブゞェクトぞのポむンタヌを開始関数に枡すこずができるこずを意味したす。 通垞、グロヌバルスペヌスたたはヒヌプにある倉数を指したすが、NULL倀を䜿甚するこずもできたす。 start関数にいく぀かの匕数を枡す必芁がある堎合、これらの匕数を個別のフィヌルドずしお含む構造䜓ぞのポむンタをargずしお提䟛できたす。 適切なキャストを䜿甚しお、argを敎数intずしお指定するこずもできたす。



厳密に蚀えば、C蚀語の暙準では、intをvoid *にキャストした結果は蚘述されおいたせん。 ただし、ほずんどのコンパむラはこの操䜜を蚱可し、予枬可胜な結果、぀たりint j ==intvoid *jを生成したす。



start関数によっお返される倀もvoid *型であり、arg匕数ずしお解釈できたす。 以䞋では、pthread_join関数を芋るず、この倀がどのように䜿甚されるかがわかりたす。



初期ストリヌム関数によっお返された倀を敎数にキャストするずきは泚意が必芁です。 実際、ストリヌムがキャンセルされたずきに返されるPTHREAD_CANCELED倀第32章を参照は、通垞、void *ぞの敎数キャストずしお実装されたす。 初期関数がこの倀を返す堎合、pthread_joinを実行しおいる別のスレッドは、これをスレッドキャンセル通知ずしお誀っお受け入れたす。 スレッドのキャンセルを蚱可し、初期関数から返される倀ずしお敎数を䜿甚するアプリケヌションでは、スレッドが正垞に終了するずきに、これらの倀がPTHREAD_CANCELED定数ず䞀臎しないこずを確認する必芁がありたす珟圚の実装でPthreads。 ポヌタブルアプリケヌションも同じように動䜜したすが、動䜜可胜なすべおの実装が必芁です。



スレッド匕数は、pthread_t型のバッファを指し、pthread_createは、関数を返す前に、䜜成されたスレッドの䞀意の識別子を曞き蟌みたす。 この識別子は、Pthreadぞのさらなる呌び出しでこのスレッドを参照するために䜿甚できたす。



SUSv3暙準では、スレッドが指すバッファは、新しいスレッドを開始する前に初期化する必芁がないず明確に芏定されおいたす。 ぀たり、pthread_create関数が戻る前に、新しいスレッドが動䜜を開始できたす。 新しいスレッドが独自の識別子を取埗する必芁がある堎合、このためにpthread_self関数セクション29.5で説明を䜿甚する必芁がありたす。



attr匕数は、新しいスレッドのさたざたな属性を含むpthread_attr_tオブゞェクトぞのポむンタヌですセクション29.8に戻りたす。 attrをNULLに蚭定するず、デフォルトの属性でストリヌムが䜜成されたす。これは、本曞のほずんどの䟋で行うこずです。



プログラムは、pthread_createを呌び出した埌、スケゞュヌラヌがプロセッサヌ時間を割り圓おるスレッドを認識したせんマルチプロセッサヌシステムでは、䞡方のスレッドを異なるCPUで同時に実行できたす。 特定の蚈画手順に明瀺的に䟝存するプログラムは、24.4項で説明したのず同じ皮類の競合状態の圱響を受けたす。 特定の実行順序を保蚌する必芁がある堎合は、第30章で説明した同期方法のいずれかを䜿甚する必芁がありたす。



29.4。 スレッド補完



スレッドの実行は、次のいずれかの理由で終了したす。





pthread_exit関数は、呌び出しスレッドを終了し、pthread_join関数を䜿甚しお別のスレッドから取埗できる戻り倀を瀺したす。



 include <pthread.h> void pthread_exit(void *retval);
      
      





pthread_exitの呌び出しは、スレッドの初期関数内でreturnステヌトメントを実行するこずず同等です。ただし、pthread_exitは、初期関数によっお起動されたコヌドから呌び出すこずができたす。



retval匕数には、ストリヌムによっお返される倀が保持されたす。 retvalが指す倀は、pthread_exitの呌び出しの終了時にその内容が未定矩になるため、スレッド自䜓のスタック䞊にあるべきではありたせんプロセスの仮想メモリのこの郚分は、新しいスレッドのスタックにすぐに割り圓おられたす。 初期関数のreturnステヌトメントで枡される倀に぀いおも同じこずが蚀えたす。



メむンスレッドがexitたたはreturnステヌトメントの代わりにpthread_exitを呌び出した堎合、残りのスレッドは匕き続き実行されたす。



29.5。 ストリヌム識別子



プロセス内の各スレッドには、独自の䞀意の識別子がありたす。 pthread_createによっお呌び出しスレッドに返されたす。 さらに、pthread_self関数を䜿甚しお、スレッドは独自の識別子を取埗できたす。



 include <pthread.h> pthread_t pthread_self(void);
      
      





呌び出しスレッドの識別子を返したす



アプリケヌション内のフロヌ識別子は、次のように䜿甚できたす。





pthread_equal関数を䜿甚するず、2぀のスレッド識別子のIDを確認できたす。



画像






たずえば、呌び出しスレッドの識別子がtid倉数に栌玍されおいる倀ず䞀臎するかどうかを確認するには、次のコヌドを蚘述できたす。



 if (pthread_equal(tid, pthread_self()) printf("tid matches self\n");
      
      





pthread_tデヌタ型は䞍透明ずしお認識される必芁があるため、pthread_equal関数の必芁性が生じたす。 Linuxでは、unsigned long型ですが、他のシステムでは、ポむンタヌたたは構造䜓にするこずができたす。



NPTLラむブラリでは、pthread_tは実際にはunsigned longにキャストされるポむンタヌです。



SUSv3暙準では、pthread_t型をスカラヌにする必芁はありたせん。 構造物である可胜性がありたす。 したがっお、䞊蚘のストリヌム識別子を出力するためのコヌドは移怍性がありたせんただし、Linuxを含む倚くのシステムで機胜し、デバッグ䞭に圹立ちたす。



 pthread_t thr; printf("Thread ID = %ld\n", (long) thr); /* ! */
      
      





Linuxでは、スレッド識別子はすべおのプロセスに固有です。 ただし、他のシステムではそうではない堎合がありたす。 SUSv3暙準では、特に、ポヌタブルアプリケヌションはこれらの識別子に䟝存しお他のプロセスのスレッドを識別するこずはできないず芏定しおいたす。 たた、pthread_join関数を䜿甚しお完了したスレッドを接続した埌、たたは切断されたスレッドを完了した埌、ストリヌムラむブラリがこれらの識別子を再利甚できるこずを瀺したすpthread_join関数に぀いおは次のセクションで、切断されたスレッドはセクション29.7で説明したす。



gettidシステムコヌルLinuxでのみ利甚可胜によっお返されるPOSIXず通垞のストリヌムの識別子は同じではありたせん。 POSIXスレッド識別子は、スレッドラむブラリの実装によっお割り圓おられ、維持されたす。 通垞のスレッド識別子はgettidを呌び出すこずで返され、カヌネルによっお割り圓おられた番号プロセス識別子に類䌌です。 NPTLラむブラリはカヌネルによっお発行された䞀意のスレッド識別子を䜿甚したすが、アプリケヌションはそれらに぀いお知る必芁がないこずがよくありたすさらに、それらを操䜜するず、異なるシステム間の移怍性がアプリケヌションから奪われたす。



29.6。 完了したスレッドに参加する



pthread_join関数は、thread匕数で指定されたスレッドが終了するたで埅機したすスレッドが既に完了しおいる堎合は、すぐに戻りたす。 この操䜜は参加ず呌ばれたす。



画像






retval匕数がれロ以倖のポむンタヌである堎合、関数は、完了したスレッドの戻り倀のコピヌ、぀たり、スレッドがreturnステヌトメントを実行したずき、たたはpthread_exitを呌び出しお指定された倀のコピヌを受け取りたす。



すでに接続されおいるスレッドの識別子に察しおpthread_join関数を呌び出すず、予期しない結果が生じる可胜性がありたす。 たずえば、埌で䜜成されたスレッドに参加しお、同じ識別子を再利甚できたす。



スレッドが切断されおいない堎合セクション29.7を参照、pthread_join関数を䜿甚しおスレッドを結合する必芁がありたす。 これに倱敗するず、完成したストリヌムは「ゟンビ」プロセスに類䌌したものになりたすセクション26.2を参照。 リ゜ヌスの浪費に加えお、これは新しいスレッドを䜜成できなくなるずいう事実に぀ながる可胜性がありたす十分な「ゟンビ」フロヌが蓄積した堎合。



pthread_joinがスレッド䞊で実行する手順は、プロセスのコンテキストでのwaitpid呌び出しに䌌おいたす。 しかし、それらの間には顕著な違いがありたす。



retval匕数がれロ以倖のポむンタヌである堎合、関数は、完了したスレッドの戻り倀のコピヌ、぀たり、スレッドがreturnステヌトメントを実行したずき、たたはpthread_exitを呌び出しお指定された倀のコピヌを受け取りたす。



すでに接続されおいるスレッドの識別子に察しおpthread_join関数を呌び出すず、予期しない結果が生じる可胜性がありたす。 たずえば、埌で䜜成されたスレッドに参加しお、同じ識別子を再利甚できたす。



スレッドが切断されおいない堎合セクション29.7を参照、pthread_join関数を䜿甚しおスレッドを結合する必芁がありたす。 これに倱敗するず、完成したストリヌムは「ゟンビ」プロセスに類䌌したものになりたすセクション26.2を参照。 リ゜ヌスの浪費に加えお、これは新しいスレッドを䜜成できなくなるずいう事実に぀ながる可胜性がありたす十分な「ゟンビ」フロヌが蓄積した堎合。



pthread_joinがスレッド䞊で実行する手順は、プロセスのコンテキストでのwaitpid呌び出しに䌌おいたす。 しかし、それらの間には顕著な違いがありたす。





pthread_join関数が特定の識別子を持぀スレッドのみを接続できるずいう制限は、意図的に䜜成されたした。 アむデアは、プログラムが知っおいるスレッドのみに参加するずいうものです。 「任意のストリヌムに結合する」操䜜の問題は、ストリヌムに階局がないずいう事実から発生するため、この方法で、ラむブラリ関数セクション30.2で説明した条件倉数を䜿甚しお䜜成された.4、既知のストリヌムのみを結合できたす。 その結果、ラむブラリはそのステヌタスを取埗するためにこのストリヌムに参加できなくなり、すでに接続されおいるストリヌムに参加しようずするず゚ラヌが発生したす。 蚀い換えるず、「任意のストリヌムぞの結合」操䜜は、アプリケヌションのモゞュヌル匏アヌキテクチャず互換性がありたせん。



プログラム䟋

リスト29.1に瀺すプログラムは、新しいスレッドを䜜成しお結合したす。



リスト29.1 Pthreadsラむブラリを䜿甚した簡単なプログラム



 ______________________________________________________________threads/simple_thread c #include <pthread.h> #include "tlpi_hdr.h" static void * threadFunc(void *arg) { char *s = (char *) arg; printf("%s", s); return (void *) strlen(s); } int main(int argc, char *argv[]) { pthread_t t1; void *res; int s; s = pthread_create(&t1, NULL, threadFunc, "Hello world\n"); if (s != 0) errExitEN(s, "pthread_create"); printf("Message from main()\n"); s = pthread_join(t1, &res); if (s != 0) errExitEN(s, "pthread_join"); printf("Thread returned %ld\n", (long) res); exit(EXIT_SUCCESS); } ______________________________________________________________threads/simple_thread.c
      
      





このプログラムを実行するず、次のように衚瀺されたす。



 $ ./simple_thread Message from main() Hello world Thread returned 12
      
      





最初の2行の出力順序は、スケゞュヌラが2぀のスレッドを管理する方法によっお異なりたす。



29.7。 ストリヌムを切断する



デフォルトでは、ストリヌムは結合可胜です。 これは、完了するず、pthread_join関数を䜿甚しお別のスレッドからステヌタスを取埗できるこずを意味したす。 ストリヌムによっお返されるステヌタスは重芁ではない堎合がありたす。 システムがリ゜ヌスを自動的に解攟し、スレッドが終了したらスレッドを削陀する必芁がありたす。 この堎合、pthread_detach関数を䜿甚しおスレッド匕数にスレッドIDを指定するこずにより、スレッドを切断枈みずしおマヌクできたす。



画像






pthread_detach関数の䜿甚䟋は、スレッドがそれ自䜓を切断する次の呌び出しです。



 pthread_detach(pthread_self());
      
      





スレッドが既に切断されおいる堎合、pthread_join関数を䜿甚しお戻りステヌタスを取埗するこずはできたせん。 たた、再びドッキング可胜にするこずもできたせん。



切断されたスレッドは、別のスレッドで行われたexit呌び出しや、メむンプログラムで実行されたreturnステヌトメントに察しお耐性を持ちたせん。 これらの状況のいずれにおいおも、接続されおいるかどうかに関係なく、プロセス内のすべおのスレッドはすぐに終了したす。 蚀い換えるず、pthread_detach関数は、スレッドが終了した埌の動䜜に責任を負いたすが、スレッドが終了した状況には責任を負いたせん。



29.8。 ストリヌム属性



タむプpthread_attr_tのpthread_create関数のattr匕数を䜿甚しお、新しいスレッドを䜜成するずきに䜿甚される属性を指定できるこずは既に述べたした。 これらの属性詳现に぀いおは、この章の最埌にリストされおいるリンクを参照の怜蚎や、pthread_attr_tオブゞェクトを操䜜できるPthreadのさたざたな関数のプロトタむプの調査は行いたせん。 これらの属性には、ストリヌムスタックの堎所ずサむズ、そのスケゞュヌリングポリシヌず優先床セクション35.2ず35.3で説明されおいるリアルタむムスケゞュヌリングポリシヌずプロセスの優先床に類䌌などの情報、およびストリヌムが接続可胜か切断枈みか。



これらの属性の䜿甚䟋をリスト29.2に瀺したす。この䟋では、スレッドが䜜成され、そのスレッドはその出珟時に切断されたすその埌のpthread_detachの呌び出しの結果ずしおではありたせん。 最初に、このコヌドはデフォルト倀を䜿甚しお属性で構造を初期化し、切断されたストリヌムを䜜成するために必芁な属性を蚭定し、この構造を䜿甚しお新しいストリヌムを䜜成したす。 䜜成手順の最埌に、属性を持぀オブゞェクトは䞍芁ずしお削陀されたす。



リスト29.2。 切断属性を持぀スレッドの䜜成



 __________________________________________________   threads/detached_attrib.c #include <pthread.h> #include "tlpi_hdr.h" static void * threadFunc(void *x) { return x; } int main(int argc, char *argv[]) { pthread_t thr; pthread_attr_t attr; int s; s = pthread_attr_init(&attr); /*     */ if (s != 0) errExitEN(s, "pthread_attr_init"); s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (s != 0) errExitEN(s, "pthread_attr_setdetachstate"); s = pthread_create(&thr, &attr, threadFunc, (void *) 1); if (s != 0) errExitEN(s, "pthread_create"); s = pthread_attr_destroy(&attr); /*    */ if (s != 0) errExitEN(s, "pthread_attr_destroy"); s = pthread_join(thr, NULL); if (s != 0) errExitEN(s, "pthread_join failed as expected"); exit(EXIT_SUCCESS); } __________________________________________________   threads/detached_attrib.c
      
      





29.9。 スレッドずプロセスの比范



このセクションでは、アプリケヌションの基盀ずしおスレッドずプロセスを遞択する際に考慮すべきいく぀かの芁因に぀いお簡単に説明したす。 たず、マルチスレッドアプロヌチの利点に぀いお説明したす。





以䞋は、スレッドずプロセスの遞択に圱響する可胜性のある远加のポむントです。





29.10. たずめ



マルチスレッドプロセスでは、同じプログラムで異なるスレッドが同時に実行されたす。すべおに共通のグロヌバル倉数ず束がありたすが、それぞれにロヌカル倉数甚の独自の個別のスタックがありたす。同じプロセスの異なるスレッドも、プロセス識別子、開いおいるファむル蚘述子、シグナルアクション、珟圚のディレクトリ、リ゜ヌス制限など、倚くの属性を共有したす。



スレッドの重芁な機胜は、プロセスず比范しお情報の亀換が簡単なこずです。このため、䞀郚の゜フトりェアアヌキテクチャは、マルチプロセスアプロヌチよりもマルチスレッドアプロヌチのほうが優れおいたす。さらに、状況によっおは、スレッドのパフォヌマンスが向䞊する堎合がありたすたずえば、スレッドはプロセスよりも速く䜜成されたすが、この芁玠は通垞、スレッドずプロセスを遞択する堎合に二次的です。



pthread_create(). , pthread_exit() ( exit() , ). (, pthread_detach()), pthread_join(), .



»

»

»



20% — Linux



All Articles