Multi-Threadについて
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
[[藤井のスタートページ]]
*序 [#e19b6173]
一般に GUI (Graphical User Interface) が使われるようにな...
Programming 的には multi-thread を使う機会が増えるように...
その主たる理由は、本体の program の実行中に user が graph...
を通じて様々なことをやろうとする(window のサイズを変える...
中止のボタンを押すとか)のを受け付けてやる必要がある点で...
本体の program の終了まで、これらの操作が受け付けられない...
困る。そこで、本体は別 thread として動かし、user の要求の...
常時行うようにするのが自然な program 設計であろう。
例えばデータ収集プログラムでは、データ収集開始の指示が出...
データ収集の部分、すなわち測定器からのデータを読み取り、...
必要ならモニタデータを表示する部分は別 thread として起動...
ユーザの操作(一時停止、再開、終了など)は常時受け付ける...
するのが自然な書き方であろう。
*Threadの生成 [#f9974160]
Threadの生成は、POSIX系のOSでは pthread_create、Windowsで...
CreateThread(この他にも _beginthread や _beginthreadex ...
ある)で行う。いずれもthreadの開始とともにstartする関数の...
与える。この関数は引数を一つとることができ、通常は必要なp...
など(のセット)のaddress を与える。この引数についてもthr...
関数の引数で与える。
Thread生成時の状態はthread生成関数の引数の一つとして
与えるthread attributesで決まる。生成と同時に開始するか、
生成時は一時停止状態で、開始の指示は後から与えるかが
選択できる。
**Threadとの通信 [#rf4fe0ef]
Threadは同一process内で動いているので、main threadとmemor...
可能である。従って、排他制御が必要でなければ通信は比較的...
できる。ただし、共通に使う変数に関しては他所で値を変える...
あることをcompilerに示唆するためvolatile宣言を付加してお...
一般に共有変数に対し排他制御が必要になるような使い方は極...
べきである。排他制御とdeadlockは表裏一体である。
**Threadの状態の把握 [#eea90d64]
Threadの状態、特に終了したか否かをmain threadから知りたい...
多々ある。特にprogram全体を穏やかに終了するには子threadが...
しているかどうか知りたい。
Threadの状態を示す共有変数を用意するのも一つの方法で
あるがWindowsの場合は、POSIXのselectに似たsmartな
やり方が用意されている。
Windowsのthread生成関数であるCreateThread関数は、HANDLEを...
このHANDLEはsignalを持っていて、このHANDLEがsignal状態に...
threadは終了している。Windowsにはsignal状態になるのを待つ...
用意されている(WaitForSingleObject、WaitForMultipleObjec...
これを使って子threadの終了を待ってmain thread
を終了するという芸当が簡単にできる。
POSIX thread では pthread_join() 関数を用いて thread の終...
待つことはできる。しかし「複数 thread のうちどれか一つが...
などという待ち方は pthread_join() だけではできない。
**C++とthread start routine [#r88b96ea]
いくつものthreadを生成したい時、似たような処理を繰り返す...
ので、C++であればbaseとなるthread classを作って、そこから...
派生させobjectを生成したくなる。この時問題になるのがstart...
で、これはstatic関数でなければならない。Object生成前に関...
存在していなければならないからである。
終了行:
[[藤井のスタートページ]]
*序 [#e19b6173]
一般に GUI (Graphical User Interface) が使われるようにな...
Programming 的には multi-thread を使う機会が増えるように...
その主たる理由は、本体の program の実行中に user が graph...
を通じて様々なことをやろうとする(window のサイズを変える...
中止のボタンを押すとか)のを受け付けてやる必要がある点で...
本体の program の終了まで、これらの操作が受け付けられない...
困る。そこで、本体は別 thread として動かし、user の要求の...
常時行うようにするのが自然な program 設計であろう。
例えばデータ収集プログラムでは、データ収集開始の指示が出...
データ収集の部分、すなわち測定器からのデータを読み取り、...
必要ならモニタデータを表示する部分は別 thread として起動...
ユーザの操作(一時停止、再開、終了など)は常時受け付ける...
するのが自然な書き方であろう。
*Threadの生成 [#f9974160]
Threadの生成は、POSIX系のOSでは pthread_create、Windowsで...
CreateThread(この他にも _beginthread や _beginthreadex ...
ある)で行う。いずれもthreadの開始とともにstartする関数の...
与える。この関数は引数を一つとることができ、通常は必要なp...
など(のセット)のaddress を与える。この引数についてもthr...
関数の引数で与える。
Thread生成時の状態はthread生成関数の引数の一つとして
与えるthread attributesで決まる。生成と同時に開始するか、
生成時は一時停止状態で、開始の指示は後から与えるかが
選択できる。
**Threadとの通信 [#rf4fe0ef]
Threadは同一process内で動いているので、main threadとmemor...
可能である。従って、排他制御が必要でなければ通信は比較的...
できる。ただし、共通に使う変数に関しては他所で値を変える...
あることをcompilerに示唆するためvolatile宣言を付加してお...
一般に共有変数に対し排他制御が必要になるような使い方は極...
べきである。排他制御とdeadlockは表裏一体である。
**Threadの状態の把握 [#eea90d64]
Threadの状態、特に終了したか否かをmain threadから知りたい...
多々ある。特にprogram全体を穏やかに終了するには子threadが...
しているかどうか知りたい。
Threadの状態を示す共有変数を用意するのも一つの方法で
あるがWindowsの場合は、POSIXのselectに似たsmartな
やり方が用意されている。
Windowsのthread生成関数であるCreateThread関数は、HANDLEを...
このHANDLEはsignalを持っていて、このHANDLEがsignal状態に...
threadは終了している。Windowsにはsignal状態になるのを待つ...
用意されている(WaitForSingleObject、WaitForMultipleObjec...
これを使って子threadの終了を待ってmain thread
を終了するという芸当が簡単にできる。
POSIX thread では pthread_join() 関数を用いて thread の終...
待つことはできる。しかし「複数 thread のうちどれか一つが...
などという待ち方は pthread_join() だけではできない。
**C++とthread start routine [#r88b96ea]
いくつものthreadを生成したい時、似たような処理を繰り返す...
ので、C++であればbaseとなるthread classを作って、そこから...
派生させobjectを生成したくなる。この時問題になるのがstart...
で、これはstatic関数でなければならない。Object生成前に関...
存在していなければならないからである。
ページ名: