ITメモ
C言語 / Programming Language C
開発環境 / Development Environment
【Mac】Xcode【Win】Visual Stadio
基礎 / Basic
About C言語書式コメントコンパイルとリンクメイクファイル / Makefileヘッダファイル変数定数型 / Type配列 / Arrayポインタ / Pointer演算子 / Operator制御文 / Control Statement関数指定子 / 修飾子構造体と共用体 / Structure & Unionプリプロセッサ / PreprocessorthisキーワードTypedef
入出力 / Input & Output
入出力入力フォーマット指定子出力フォーマット指定子「printf」関数を使って文字を出力・表示させる方法「printf_s」関数を使って文字を出力・表示させる方法「scanf」関数を使って入力させる方法「scanf_s」関数を使って入力させる方法「getchar」関数を使って「1文字」だけ入力させる方法「gets」関数を使って「文字列」を入力させる方法
文字列 / String
文字列 / String「snprintf」関数で「配列」に文字列を書き込む方法
ネットワーク / Network
memset - メモリブロックのセット
メモリー管理
メモリー
オペレーション / Operation
ファイルを操作をする方法コマンドラインプログラム / Command-Line Programプロセス / Processソケット通信 / Socket Communication
用語集 / Glossary
サブルーチン / Subroutineスタックとキュー / Stack & Cueスレッド / Thread
C言語標準ライブラリ(ヘッダファイル)
C言語標準ライブラリ【assert.h】 - 診断機能【complex.h】 - 複素数計算【ctype.h】 - 文字操作【errno.h】 - エラー【fenv.h】 - 浮動小数点環境【float.h】 - 浮動小数点型の特性【inttypes.h】 - 整数型の書式の変換【iso646.h】 - 代替つづり(Alternate spellings)【limits.h】 - 整数型の大きさ【locale.h】 - 文化圏固有操作【math.h】 - 数学【setjmp.h】 - 非局所分岐【signal.h】 - シグナル操作【stdalign.h】 - アライメント【stdarg.h】 - 可変個数の実引数【stdatomic.h】 - アトミック操作【stdbool.h】 - 論理型および論理値【stddef.h】 - 共通の定義【stdint.h】 - 整数型【stdio.h】 - 入出力【stdlib.h】 - 一般ユーティリティ【stdnoreturn.h】 - _Noreturn【string.h】 - 文字列操作【tgmath.h】 - 型総称数学関数(Type-generic math)【threads.h】 - マルチスレッド【time.h】 - 日付及び時間【uchar.h】 - Unicodeユーティリティ【wchar.h】 - 多バイトおよびワイド文字拡張ユーティリティ【wctype.h】 - ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ
C言語ライブラリ(ヘッダファイル)
C言語ヘッダファイル【winsock.h】





【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 ();
現在のスレッド識別子を取得する