名 前
pthread_mutex_init, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock, pthread_mutex_destroy − mutex の 操 作
書 式
#include <pthread.h>
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex));
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
説 明
mutex は 、 排 他 制 御 (MUTual EXclusion) の 仕 組 み で あ り 、 共 有 デ ー タ の 同 時 更 新 か ら の 保 護 、 ク リ テ ィ カ ル セ ク シ ョ ン (critical section) や モ ニ タ の 実 装 な ど に 使 わ れ る 。
mutex は 二 つ の 状 態 を 取 り う る 。 そ れ は 、 ア ン ロ ッ ク 状 態 (ど の ス レ ッ ド に も 保 有 さ れ て い な い )と ロ ッ ク 状 態 (一 つ の ス レ ッ ド に 保 有 さ れ て い る )で あ る 。 二 つ の 異 な る ス レ ッ ド が 同 時 に 一 つ の mutex を 保 有 す る こ と は な い 。 既 に 他 の ス レ ッ ド に よ っ て ロ ッ ク さ れ た mutex を ロ ッ ク し よ う と す る ス レ ッ ド は 、 保 有 側 の ス レ ッ ド が 先 に そ の mutex を ア ン ロ ッ ク す る ま で 実 行 を 停 止 さ せ ら れ る 。
pthread_mutex_init は mutex が 指 す mutex オ ブ ジ ェ ク ト を 、 mutexattr で 指 定 さ れ た mutex 属 性 オ ブ ジ ェ ク ト に 従 っ て 初 期 化 す る 。 mutexattr が NULL, な ら ば 、 デ フ ォ ル ト の 属 性 が こ の か わ り に 使 わ れ る 。
LinuxThreads の 実 装 は た だ 一 つ の 属 性 mutex kind だ け に 対 応 し て い る 。 こ の 属 性 は 、 「 速 い 」 (’’fast’’)、 「 再 帰 的 な 」 (’’recursive’’)、 ま た は 「 エ ラ ー 検 査 を 行 な う 」 (’’error checking’’)の い ず れ か を 指 定 す る も の で あ る 。 mutex の 種 別 (kind)は 、 そ の mutex を 既 に 保 有 し て い る ス レ ッ ド が 、 そ れ を 再 び ロ ッ ク で き る か ど う か を 決 定 す る 。 デ フ ォ ル ト の 種 別 は 「 速 い 」 で あ る 。 mutex 属 性 の よ り 詳 し い 情 報 は 、 pthread_mutexattr_init(3) を 見 よ 。
pthread_mutex_t 型 の 変 数 は 、 (速 い mutex に 対 す る )定 数 PTHREAD_MUTEX_INITIALIZER と 、 (再 帰 的 mutex に 対 す る ) PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP お よ び 、 (エ ラ ー 検 査 を 行 な う mutex に 対 す る ) PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP で 、 静 的 に 初 期 化 す る こ と も で き る 。
pthread_mutex_lock は 、 与 え ら れ た mutex を ロ ッ ク す る 。 mutex が 現 在 ロ ッ ク さ れ て い な け れ ば 、 そ れ は ロ ッ ク さ れ 、 呼 び 出 し ス レ ッ ド に よ っ て 所 有 さ れ る 。 こ の 場 合 pthread_mutex_lock は 直 ち に 返 る 。 mutex が 他 の ス レ ッ ド に よ っ て 既 に ロ ッ ク さ れ て い た の な ら ば 、 pthread_mutex_lock は mutex が ア ン ロ ッ ク さ れ る ま で 呼 び 出 し ス レ ッ ド の 実 行 を 停 止 さ せ る 。
mutex が 呼 び 出 し 側 の ス レ ッ ド に よ り 既 に ロ ッ ク さ れ て い る 場 合 に は 、 pthread_mutex_lock の 振 舞 い は 、 mutex の 種 別 に 依 存 す る 。 mutex の 種 別 が 「 速 い 」 で あ れ ば 、 呼 び 出 し ス レ ッ ド は mutex が ア ン ロ ッ ク さ れ る ま で 実 行 を 停 止 す る 。 従 っ て 事 実 上 呼 び 出 し ス レ ッ ド の デ ッ ド ロ ッ ク を 引 き 起 こ す 。 mutex の 種 別 が 「 エ ラ ー を チ ェ ッ ク す る 」 で あ れ ば 、 pthread_mutex_lock は エ ラ ー コ ー ド EDEADLK と と も に 直 ち に 戻 る 。 mutex の 種 別 が 「 再 帰 的 」 な ら ば 、 pthread_mutex_lock は 成 功 し 直 ち に 戻 る 。 こ の 際 、 呼 び 出 し ス レ ッ ド が 、 そ の mutex を ロ ッ ク し た 回 数 を 記 録 す る 。 こ の mutex が ア ン ロ ッ ク 状 態 に 戻 る に は 、 同 数 の pthread_mutex_unlock 操 作 が 実 行 さ れ ね ば な ら な い 。
pthread_mutex_trylock は pthread_mutex_lock と 同 様 に 振 舞 う が 、 mutex が 既 に 他 の ス レ ッ ド に よ っ て (あ る い は 、 「 速 い 」 mutex の 場 合 、 呼 び 出 し ス レ ッ ド に よ っ て ) ロ ッ ク さ れ て い る 場 合 、 呼 び 出 し ス レ ッ ド を ブ ロ ッ ク し な い 。 か わ り に 、 pthread_mutex_trylock は エ ラ ー コ ー ド EBUSY で 直 ち に 戻 る 。
pthread_mutex_unlock
は 、 与 え ら れ
た mutex を ア ン ロ ッ
ク す る 。
pthread_mutex_unlock の 開 始
時 点 で 、 こ の mutex
は 呼 び 出 し ス
レ ッ ド に よ り
ロ ッ ク さ れ 所
有 さ れ て い る
も の と 仮 定 さ
れ る 。
mutex が 「 速 い 」 種
別 の も の な ら
ば 、 pthread_mutex_unlock は
常 に そ れ を ア
ン ロ ッ ク 状 態
に 戻 す 。 そ れ
が 「 再 帰 的 な
」 種 別 な ら ば
、
mutex の ロ ッ ク 計 数
(こ の mutex に 対 し て
pthread_mutex_lock 操 作 が
呼 び 出 し ス レ
ッ ド で 実 行 さ
れ た 回 数 ) を 一
つ 減 ら し 、 こ
の 計 数 が ゼ ロ
に な っ た 時 に
、 初 め て mutex が 実
際 に ア ン ロ ッ
ク さ れ る 。 「
エ ラ ー を 検 査
す る 」 mutex に 対 し
て は 、 pthread_mutex_unlock
は 実 行 時 に 実
際 に 、 mutex が 開 始
時 点 で ロ ッ ク
さ れ て い る か
、 ま た 、 そ れ
は 現 在 pthread_mutex_unlock
を 呼 ん で い る
の と 同 じ ス レ
ッ ド に よ っ て
ロ ッ ク さ れ た
か ど う か 、 を
検 査 す る 。 こ
れ ら の 条 件 が
満 た さ れ な い
場 合 に は 、 エ
ラ ー コ ー ド が
返 さ れ 、 mutex は 不
変 の ま ま に さ
れ る 。 「 速 い
」 mutex と 「 再 帰 的
な 」 mutex は こ の よ
う な チ ェ ッ ク
を 行 な わ な ず
、 よ っ て 、 ロ
ッ ク さ れ た mutex を
所 有 者 以 外 の
ス レ ッ ド に よ
っ て ア ン ロ ッ
ク す る こ と を
可 能 に し て い
る 。 こ れ は 、
移 植 性 の な い
振 舞 い で あ り
、 こ れ に 依 存
す る よ う な こ
と は す べ き で
な い 。
pthread_mutex_destroy は 、 mutex オ ブ ジ ェ ク ト を 破 壊 し 、 そ れ が 保 持 し て い る 可 能 性 の あ る 資 源 を 開 放 す る 。 mutex は 関 数 の 開 始 時 点 で ア ン ロ ッ ク さ れ て い な け れ ば な ら な い 。 LinuxThreads の 実 装 で は 、 い か な る 資 源 も mutex オ ブ ジ ェ ク ト に 付 随 し て い な い 。 故 に pthread_mutex_destroy は 実 際 の と こ ろ 、 mutex が ア ン ロ ッ ク さ れ て い る か ど う か を 検 査 す る 以 外 の こ と は 何 も し な い 。
取 り 消 し
い か な る mutex 関 数 も 取 り 消 し ポ イ ン ト で は な い 。 pthread_mutex_lock で さ え も 、 そ れ が 任 意 の 時 間 ス レ ッ ド の 実 行 を 停 止 さ せ う る と い う 事 実 に も 関 わ ら ず 、 取 り 消 し ポ イ ン ト で は な い 。 こ れ に よ り 、 取 り 消 し ポ イ ン ト に お け る mutex の 状 態 は 予 測 可 能 と な り 、 取 り 消 し ハ ン ド ラ が 、 ス レ ッ ド の 実 行 停 止 以 前 に ア ン ロ ッ ク さ れ る 必 要 の あ る mutex ま さ に そ れ の み を 、 正 確 に ア ン ロ ッ ク す る こ と を 可 能 に し て い る 。 こ の 結 果 、 遅 延 取 り 消 し を 用 い る ス レ ッ ド は 、 決 し て 余 計 な 時 間 mutex を 所 有 す る こ と は な い 。
非 同 期 シ グ ナ ル に 対 す る 安 全 性
mutex 関 数 は 非 同 期 シ グ ナ ル に 対 し て 安 全 で は な い 。 こ れ の 意 味 す る と こ ろ は 、 そ れ ら は シ グ ナ ル ハ ン ド ラ か ら 呼 ぶ べ き で は な い 、 と い う こ と で あ る 。 特 に pthread_mutex_lock ま た は pthread_mutex_unlock の シ グ ナ ル ハ ン ド ラ か ら の 呼 び 出 し は 、 呼 び 出 し ス レ ッ ド を デ ッ ド ロ ッ ク さ せ る 恐 れ が あ る 。
返 り 値
pthread_mutex_init は 、 常 に 0 を 返 す 。 他 の mutex 関 数 は 、 成 功 す れ ば 0 を 返 し 、 エ ラ ー で は 非 ゼ ロ の エ ラ ー コ ー ド を 返 す 。
エ ラ ー
pthread_mutex_lock は エ ラ ー の 際 、 次 の エ ラ ー コ ー ド を 返 す :
EINVAL |
mutex が 適 切 に 初 期 化 さ れ て い な い 。 |
EDEADLK
mutex は 既 に 呼 び 出 し ス レ ッ ド に よ り ロ ッ ク さ れ て い る 。 (「 エ ラ ー 検 査 を 行 な う 」 mutexes の み )
pthread_mutex_trylock は エ ラ ー の 際 、 次 の エ ラ ー コ ー ド を 返 す :
EBUSY 現 在 ロ ッ ク さ れ て い る の で |
mutex を 取 得 で き な い 。 | ||
EINVAL |
mutex が 適 切 に 初 期 化 さ れ て い な い 。
pthread_mutex_unlock は エ ラ ー の 際 、 次 の エ ラ ー コ ー ド を 返 す :
EINVAL |
mutex が 適 切 に 初 期 化 さ れ て い な い 。 呼 び 出 し ス レ ッ ド は mutex を 所 有 し て い な い 。 (「 エ ラ ー を 検 査 す る 」 mutex の み ) pthread_mutex_destroy は エ ラ ー の 際 、 次 の エ ラ ー コ ー ド を 返 す :
著 者Xavier Leroy <Xavier.Leroy [AT] inria.fr> 関 連 項 目pthread_mutexattr_init(3), pthread_mutexattr_setkind_np(3), pthread_cancel(3). 例共 有 さ れ る 大 域 変 数 x は mutex に よ り 次 の よ う に 保 護 さ れ る : int x; pthread_mutex_lock(&mut);
[訳 注 ] glibc-linuxthreads の 最 新 の ド キ ュ メ ン ト は Texinfo 形 式 で 提 供 さ れ て い る 。 上 の 記 述 は glibc-linuxthreads-2.2 以 降 で は 正 し く な い 。 以 下 は glibc-linuxthreads-2.3.1 の Texinfo フ ァ イ ル か ら の 引 用 で あ る 。 種 別 (kind) が 型 (type) に 変 更 さ れ て い る 。 LinuxThreads 実 装 は た だ 1 つ の mutex 属 性 に 対 応 し て い る 。 そ れ は mutex 型 (mutex type) で 、 「 速 い (fast) 」 、 「 再 帰 的 な (recursive) 」 、 「 時 刻 情 報 つ き (timed) 」 、 「 エ ラ ー 検 査 を 行 な う (error checking) 」 の い ず れ か で あ る 。 mutex 型 は 、 あ る ス レ ッ ド が 自 分 自 身 で す で に 保 持 し て い る mutex を ロ ッ ク で き る か ど う か を 決 定 す る 。 デ フ ォ ル ト の mutex 型 は 「 時 刻 情 報 つ き (timed) 」 で あ る 。 pthread_mutex_t 型 の 変 数 は 、 定 数 PTHREAD_MUTEX_INITIALIZER ( 時 刻 情 報 つ き (timed) mutex 用 ) 、 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP ( 再 帰 的 な (recursive) mutex 用 ) 、 PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP ( 速 い (fast) mutex 用 ) 、 PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP ( エ ラ ー 検 査 を 行 な う (error checking) mutex 用 ) を 用 い て 静 的 に 初 期 化 す る こ と も で き る 。 |