POSIX
POSIX Pthreadsライブラリのpthread_exit関数とメインスレッドとの関係について。本記事の内容はStackOverflowで見つけた質問と回答に基づく。まとめ: exit関数で終了:他のスレッドが実行中であってもプロセス終了する。 注:main関数からのreturnはexit関…
C標準ライブラリrealloc関数に対して、サイズ0を指定すべきでない。realloc(ptr, 0)によってptrが指すメモリブロックが解放(free(ptr)相当)される保証はない。この動作は ISO C および POSIX それぞれで明言されている。JPCERT MEM04-C サイズ0のメモリ割…
macOS(旧Mac OS X)では POSIX無名(unnamed)セマフォ を意図的にサポートしない。 無名セマフォ生成sem_initや破壊sem_destroy関数呼び出しはerrno=ENOSYS(function not supported)/戻り値-1で常に失敗する。(おまけ:sem_getvalue関数も非サポート)名前…
プロセス終了コードの有効範囲についてメモ。 POSIX: 0〜255。整数値のうち下位8ビットのみ有効。(例: 値257は終了コード1と解釈される) Windows: 0〜4294967295。32ビット整数値。 POSIX規格(IEEE Std 1003.1-2008, 2016 Ed.)より一部引用。 If the new…
POSIX環境にて提供されるreaddir, readdir_r関数に関するメモ。まとめ: 事実上スレッドセーフが保証されるreaddir関数を使うこと。将来のPOSIX規格でスレッドセーフ保証が追加予定。 readdir_r関数を利用してはならない。POSIXからも廃止予定であり、GLIBC …
C標準ライブラリscanf関数の書式指定%sにおいて、取得先の文字列バッファを動的確保する機能拡張。 // POSIX準拠システム char *s = NULL; scanf("%ms", &s); // sはmallocで確保される ... free(s); まとめ: 標準C(ISO C):該当機能は存在しない。メモリ領…
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 関数が最有力候補。ただし Undocumented </stdio.h>…
条件変数(condition variable)同期プリミティブの利用に関して、不適切な単一スレッド通知notify_oneの使用によるデッドロック(dead lock)発生についてメモ。(条件変数 Step-by-Step入門のおまけ記事) 問題: 1生産者スレッド−1消費者スレッドのとき、mt_s…
条件変数(condition variable)同期プリミティブの利用に関して、不適切な単一スレッド通知notify_oneの使用によるデッドロック(dead lock)発生についてメモ。(条件変数 Step-by-Step入門のおまけ記事)スレッド間の非同期データ送受信機構mt_slot<T>として*1、</t>…
長いのでこちら→条件変数 Step-by-Step入門 - yohhoyの日記(別館) コード:https://gist.github.com/yohhoy/d305a6c5249c55ed89a3
POSIXスレッド(pthread)のバリア同期プリミティブpthread_barrier_tはAdvanced Realtime Threads追加機能(XSI Option)のため提供されない処理系もある。 2022-08-12追記:IEEE Std 1003.1-2017現在は Base仕様に含まれる ため、全てのPOSIX準拠処理系で提供…
ある処理系が “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標準ライブラリの<stdio.h>ヘッダで提供されるストリーム入出力関数において、複数スレッドから同時に対象ストリーム入出力操作を行ったときの振る舞い(スレッド安全性)に関するメモ。まとめ: C99以前:POSIX準拠システムならばスレッド安全である。(それ以外は処</stdio.h>…
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 { constexpr…
C11標準ライブラリ、C++11標準ライブラリ、POSIXスレッドのスレッドライブラリ(Pthreads) API比較。各スレッドライブラリAPIを、“スレッド”、“CallOnce”、“排他制御(mutex)”、“条件変数(condition variable)”、“TLS(Thread Local Storage)”、その他機能に分…
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…
条件変数(condition variable)同期プリミティブに対する待機/通知で発生する現象と回避策のメモ。条件変数とミューテックスを使ったコードにおいて次のような現象が生じる。 スレッドAが条件変数cvに対して通知を行う。 条件変数cvに対してブロックされてい…
条件変数(condition variable)同期プリミティブにまつわる "spurious wakeup" についてメモ。安定した対訳語が存在しないようなので、本記事ではそのまま英語表記とする*1。spurious は “偽の; 疑似; 似非” といった意味の単語であり*2、wakeup は “条件変数…
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 …