yohhoyの日記

技術的メモをしていきたい日記

POSIX

プロセス終了コードの有効範囲

プロセス終了コードの有効範囲についてメモ。 POSIX: 0〜255。整数値のうち下位8ビットのみ有効。(例: 値257は終了コード1と解釈される) Windows: 0〜4294967295。32ビット整数値。 POSIX規格(IEEE Std 1003.1-2008, 2016 Ed.)より一部引用。 If the new…

readdir/readdir_r関数のあれこれ

POSIX環境にて提供されるreaddir、readdir_r関数に関するメモ。まとめ: 事実上スレッドセーフが保証される readdir 関数を使うこと。将来のPOSIX規格でスレッドセーフ保証が追加予定。 readdir_r 関数を利用してはならない。POSIXからも廃止予定であり、GLI…

scanf文字列取得と動的メモリ確保

C標準ライブラリscanf関数の書式指定%sにおいて、取得先の文字列バッファを動的確保する機能拡張。 // POSIX準拠システム char *s = NULL; scanf("%ms", &s); // sはmallocで確保される ... free(s); まとめ: 標準C(ISO C):該当機能は存在しない。メモリ領…

recursive mutexはいつ使う?

POSIX recursive mutexに関するDavid Butenhof氏*1の見解。2005年のニュースグループcomp.programming.threads投稿より部分引用。*2要約: 原則、recursive mutexを使ってはならない。POSIX recursive mutexは、レガシーコード保護用のグローバルMutexを避け…

アトミックなファイル更新

POSIX環境またはWindows環境において、ファイルシステム上でアトミック(atomic; 不可分)なファイル更新を実現する方法。まとめ: POSIX:stdio.h標準ヘッダ rename() 関数を利用する。 Windows:windows.hヘッダ ReplaceFile() 関数が最有力候補。ただしUn…

条件変数とデッドロック・パズル(解答編)

条件変数(condition variable)同期プリミティブの利用に関して、不適切な単一スレッド通知処理の使用によるデッドロック(dead lock)発生についてメモ。(条件変数 Step-by-Step入門のおまけ記事) 問題: 1生産者スレッド−1消費者スレッドのとき、mt_slotク…

条件変数とデッドロック・パズル(出題編)

条件変数(condition variable)同期プリミティブの利用に関して、不適切な単一スレッド通知処理の使用によるデッドロック(dead lock)発生についてメモ。(条件変数 Step-by-Step入門のおまけ記事)スレッド間の非同期データ送受信機構mt_slotとして*1、C++11…

条件変数 Step-by-Step入門

長いのでこちら→条件変数 Step-by-Step入門 - yohhoyの日記(別館) コード:https://gist.github.com/yohhoy/d305a6c5249c55ed89a3

pthread_barrier_tはオプショナル

POSIXスレッド(pthread)のバリア同期プリミティブ pthread_barrier_t はAdvanced Realtime Threads追加機能(XSI Option)のため提供されない処理系もある。IEEE Std 1003.1-2004より引用。処理系がバリア同期プリミティブを提供するか否かは、マクロ_POSIX_BA…

「pthreadサポート」の意味するところ

ある処理系が“POSIXスレッド(pthread)標準をサポートする”とき、処理系(実行環境を含む)で担保すべき事項と、利用者(アプリケーションプログラマ)が守るべき制約についてメモ。アプリケーションをプログラマの意図通り実行させるための、処理系/利用者…

ファイルの同一性判定

POSIX環境またはWindows環境にて、2つのパス文字列が同一ファイルを指すか否かを判定する方法。(ファイルが存在していることが前提) POSIX デバイスIDとinode番号*1を用いて同一性判定を行う。 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int is_identical_file(const</unistd.h></sys/stat.h></sys/types.h>…

Cストリーム入出力関数とスレッド安全性

C標準ライブラリの stdio.h ヘッダで提供されるストリーム入出力関数において、複数スレッドから同時に対象ストリーム入出力操作を行ったときの振る舞い(スレッド安全性)に関するメモ。まとめ: C99以前:POSIX準拠システムならばスレッド安全である。(そ…

mutexのconstexprコンストラクタ

C++11標準ライブラリのミューテックスクラス群において std::mutex のみがconstexprなデフォルトコンストラクタをもつ。N3337 30.4.1.2.1, 30.4.1.2.2, 30.4.1.3.1, 30.4.1.3.2よりコンストラクタ宣言のみ引用。 30.4.1.2.1 Class mutex class mutex { const…

C11/C++11/POSIXスレッドAPI比較

C11標準ライブラリ、C++11標準ライブラリ、POSIXスレッドのスレッドライブラリ(Pthreads) API比較。各スレッドライブラリAPIを、“スレッド”、“CallOnce”、“排他制御(mutex)”、“条件変数(condition variable)”、“TLS(Thread Local Storage)”、その他機能に分…

POSIXメモリモデル?

POSIX規格(IEEE Std 1003.1-2001)では定式化されたメモリモデルを定義しない。 A.4.10 Memory Synchronization Formal definitions of the memory model were rejected as unreadable by the vast majority of programmers. In addition, most of the form…

条件変数とダンス(Two-Step Dance)を

条件変数(condition variable)同期プリミティブに対する待機/通知で発生する現象と回避策のメモ。条件変数とミューテックスを使ったコードにおいて次のような現象が生じる。 スレッドAが条件変数cvに対して通知を行う。 条件変数cvに対してブロックされてい…

条件変数とspurious wakeup

条件変数(condition variable)同期プリミティブにまつわる"spurious wakeup"についてメモ。安定した対訳語が存在しないようなので、本記事ではそのまま英語表記とする*1。spuriousは“偽の; 疑似; 似非”といった意味の単語であり*2、またwakeupは“条件変数で…

名前空間posix

C++11からは新しく名前空間 posix が予約された。ただし名前空間以下には何も定義されていない。 17.6.4.2.2 Namespace posix 1 The behavior of a C++ program is undefined if it adds declarations or definitions to namespace posix or to a namespace …