Manpages

名 前

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_initmutex が 指 す mutex オ ブ ジ ェ ク ト を 、 mutexattr で 指 定 さ れ た mutex 属 性 オ ブ ジ ェ ク ト に 従 っ て 初 期 化 す る 。 mutexattrNULL, な ら ば 、 デ フ ォ ル ト の 属 性 が こ の か わ り に 使 わ れ る 。

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_trylockpthread_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 が 適 切 に 初 期 化 さ れ て い な い 。

EPERM

呼 び 出 し ス レ ッ ド は mutex を 所 有 し て い な い 。 (「 エ ラ ー を 検 査 す る 」 mutex の み )

pthread_mutex_destroy は エ ラ ー の 際 、 次 の エ ラ ー コ ー ド を 返 す :

EBUSY

mutex は 現 在 ロ ッ ク さ れ て い る 。

著 者

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_t mut = PTHREAD_MUTEX_INITIALIZER;
全 て のx へ の ア ク セ ス と そ の 変 更 は pthread_mutex_lockpthread_mutex_unlock に よ っ て 、 次 の よ う に 囲 ま れ て い な け れ ば な ら な い :

pthread_mutex_lock(&mut);
/* x の 操 作 */
pthread_mutex_unlock(&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 用 ) を 用 い て 静 的 に 初 期 化 す る こ と も で き る 。