【C言語】スレッド / Thread
【C言語】
スレッド / Thread
スレッド
一つのプログラムが、起動してプロセスが一つ作成され、終了して、そのプロセスが破棄されるまでの流れの中で、プロセス内で実行されるプログラムの流れをスレッドという。
スレッド間でのデータのやり取りは簡単。メモリーをプロセス内で共有しているため。
プロセス間でのデータのやり取りは、プロセス間通信で行う。
同期処理
複数のスレッドからアクセスされるメモリは、データの読み間違いを防ぐために、「同期処理」と呼ばれるはいた制御を行う。
同期処理とは、一つのスレッドが操作を行っている間は、別のスレッドは待機をし操作を行わず、別のスレッドの操作が終了してから、操作を行う。
デッドロック=双方のスレッドが、両方とも待機状態となってしまう状態を指す。同期処理の副作用の一つ。
具体的な流れ
ディスクからプログラムが読み込まれ、メモリ中にロードされる。
プロセスが作成される。
プロセス内で読み込まれたプログラムが実行される。=スレッド
プログラムが終了すると、プロセスが破棄される。
メインスレッド
プロセス内で最初に作成されたスレッド。
メインスレッドが終了すると、プログラムが終了する。
プロセスとスレッドの違い
|
プロセス |
スレッド |
並列処理 |
可能 |
可能 |
動作 |
重い |
軽い |
作成時のメモリ領域の割り当て |
その都度割り当て |
割り当てはなし。プロセスに割り当てられたメモリ領域を使用。 |
切り替え作業 |
重い |
軽い |
スレッドの切り替え
コオペレーティブスレッド
昔のシステム。
手動でのスレッドの切り替えモデルのスレッド
プリエンプティブスレッド
最近のシステム。
スレッドの切り替えはOSが行う。
プログラムからの切り替え処理はしない。
スレッド関連コマンド
インクルードファイル
process.h
_beginthread (__cdecl *start_address, (void *) unsigned stack_size, void *arglist)
Windows上でスレッドを作成するコマンド
start_address=関数を指定。作成されたスレッドで実行
stack_size=作成するスレッドのスタックサイズを指定
arg_list=スレッドで実行する関数の引数に渡される値を指定。
DWORD WaitForSingleObject ( HANDOLE hHandole, DWORD dwMilliseconds)
指定したオブジェクトがシグナル状態になるまで待機する。
_endthread ()
Windows上でのスレッドの終了
_biginthreadex ()
基本的に_beginthread と同じ機能
比較すると、引数が増えて、スレッドで動かす関数の書式が若干異なる。
_endthreadex ()
GetCurrentThreadId ();
現在のスレッド識別子を取得する