yohhoyの日記

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

POSIX

pthread_exit on main thread

POSIX Pthreadsライブラリのpthread_exit関数とメインスレッドとの関係について。本記事の内容はStackOverflowで見つけた質問と回答に基づく。まとめ: exit関数で終了:他のスレッドが実行中であってもプロセス終了する。 注:main関数からのreturnはexit関…

realloc(ptr, 0)は廃止予定

C標準ライブラリrealloc関数に対して、サイズ0を指定すべきでない。realloc(ptr, 0)によってptrが指すメモリブロックが解放(free(ptr)相当)される保証はない。この動作は ISO C および POSIX それぞれで明言されている。JPCERT MEM04-C サイズ0のメモリ割…

macOSはPOSIX無名セマフォをサポートしない

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…

readdir/readdir_r関数のあれこれ

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

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 関数が最有力候補。ただし 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入門

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

pthread_barrier_tはオプショナル

POSIXスレッド(pthread)のバリア同期プリミティブpthread_barrier_tはAdvanced Realtime Threads追加機能(XSI Option)のため提供されない処理系もある。 2022-08-12追記:IEEE Std 1003.1-2017現在は Base仕様に含まれる ため、全てのPOSIX準拠処理系で提供…

「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準拠システムならばスレッド安全である。(それ以外は処</stdio.h>…

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 { constexpr…

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 …