名 前
pthread_setcancelstate, pthread_setcanceltype − cancelability state と cancelability type を 設 定 す る
書 式
#include <pthread.h>
int
pthread_setcancelstate(int state, int
*oldstate);
int pthread_setcanceltype(int type, int
*oldtype);
−pthread で コ ン パ イ ル し て リ ン ク す る 。
説 明
pthread_setcancelstate()
は 、 呼 び 出 し
た ス レ ッ ド の
cancelability state に state で 指
定 さ れ た 値 を
設 定 す る 。 変
更 前 の ス レ ッ
ド の cancelability state は
oldstate が 指 す バ ッ
フ ァ ー で 返 さ
れ る 。 state 引 き
数 に は 以 下 の
値 の い ず れ か
一 つ を 指 定 し
な け れ ば な ら
な い 。
PTHREAD_CANCEL_ENABLE ス レ ッ
ド は 取 り 消 し
可 能 (cancelable) で あ る
。 こ れ が 全 て
の 新 し く 作 成
さ れ る ス レ ッ
ド で の デ フ ォ
ル ト の cancelability state で
あ る 。 こ れ に
は 最 初 の ス レ
ッ ド も 含 ま れ
る 。 ス レ ッ ド
の cancelability type に よ り
、 取 り 消 し 可
能 な ス レ ッ ド
が 取 り 消 し 要
求 に い つ 反 応
す る か が 決 ま
る 。
PTHREAD_CANCEL_DISABLE ス レ ッ
ド は 取 り 消 し
で き な い 。 取
り 消 し 要 求 を
受 信 し た 際 は
、 取 り 消 し 可
能 に 設 定 さ れ
る ま で そ の 要
求 は ブ ロ ッ ク
さ れ る 。
pthread_setcanceltype()
は 、 呼 び 出 し
た ス レ ッ ド の
cancelability type に type で 指
定 さ れ た 値 を
設 定 す る 。 変
更 前 の ス レ ッ
ド の cancelability type は oldtype
が 指 す バ ッ フ
ァ ー で 返 さ れ
る 。 type 引 き 数
に は 以 下 の 値
の い ず れ か 一
つ を 指 定 し な
け れ ば な ら な
い 。
PTHREAD_CANCEL_DEFERRED そ の ス
レ ッ ド が 次 に
取 り 消 し ポ イ
ン ト (cancellation point) の 関
数 を 呼 び 出 す
ま で 取 り 消 し
要 求 が 遅 延 さ
れ る 。 こ れ が
全 て の 新 し く
作 成 さ れ る ス
レ ッ ド で の デ
フ ォ ル ト の cancelability
type で あ る 。 こ れ
に は 最 初 の ス
レ ッ ド も 含 ま
れ る 。
PTHREAD_CANCEL_ASYNCHRONOUS ス レ ッ
ド は い つ で も
取 り 消 す こ と
が で き る (通 常
は す ぐ に キ ャ
ン セ ル さ れ る
が 、 シ ス テ ム
が そ の こ と を
保 証 し て い る
わ け で は な い
)。 こ れ ら の 関
数 に よ り 実 行
さ れ る 「 設 定
と 取 得 」 操 作
(set−and−get operation) は 、
同 じ 関 数 を 呼
び 出 し た プ ロ
セ ス 内 の 他 の
ス レ ッ ド が あ
っ て も 、 ア ト
ミ ッ ク に 行 わ
れ る 。
返 り 値
成 功 す る と 、 こ れ ら の 関 数 は 0 を 返 す 。 エ ラ ー の 場 合 、 0 以 外 の エ ラ ー 番 号 を 返 す 。
エ ラ ー
pthread_setcancelstate() は 以 下 の エ ラ ー で 失 敗 す る 場 合 が あ る 。
EINVAL |
state に 無 効 な 値 が 指 定 さ れ た 。 |
pthread_setcanceltype() は 以 下 の エ ラ ー で 失 敗 す る 場 合 が あ る 。
EINVAL |
type に 無 効 な 値 が 指 定 さ れ た 。 |
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 pthread_setcancelstate() と pthread_setcanceltype() は ス レ ッ ド セ ー フ で あ る 。
準 拠
POSIX.1−2001.
注 意
ス レ ッ ド が 取 り 消 さ れ た 場 合 に 何 が 起 こ る か の 詳 細 に つ い て は pthread_cancel(3) を 参 照 。 取 り 消 し 要 求 に よ り 中 断 さ れ て は な ら な い 重 要 な ア ク シ ョ ン を ス レ ッ ド が 実 行 す る 場 合 、 短 い 時 間 だ け cancelability を 無 効 に す る の は 有 用 で あ る 。 長 い 時 間 cancelability を 無 効 に し た り 、 長 い 時 間 停 止 (block) さ れ る 可 能 性 の あ る 操 作 の 前 後 で cancelability を 無 効 に し た り す る 際 に は 注 意 す る こ と 。 な ぜ な ら 、 無 効 に し て し ま う と 、 キ ャ ン セ ル 要 求 に 対 し て ス レ ッ ド が 応 答 し な い 状 態 に な っ て し ま う か ら で あ る 。 非 同 期 キ ャ ン セ ル
cancelability type を
PTHREAD_CANCEL_ASYNCHRONOUS に 設
定 し て 役 に 立
つ こ と は め っ
た に な い 。 ス
レ ッ ド は い つ
で も キ ャ ン セ
ル す る こ と が
で き る こ と に
な る の で 、 ス
レ ッ ド が 安 全
に リ ソ ー ス の
確 保 (例 え ば
malloc(3) で メ モ リ
ー を 割 り 当 て
る ) や mutex、 セ マ フ
ォ 、 ロ ッ ク な
ど の 獲 得 を 行
う こ と が で き
な い 。 ア プ リ
ケ ー シ ョ ン は
、 ス レ ッ ド が
キ ャ ン セ ル さ
れ る 際 に 、 こ
れ ら の リ ソ ー
ス が ど の よ う
な 状 態 に あ る
か を 知 る 術 は
な い の で 、 リ
ソ ー ス の 確 保
が 安 全 で は な
く な る 。 つ ま
り 、 キ ャ ン セ
ル が 起 こ っ た
の が 、 リ ソ ー
ス の 確 保 前 な
の か 、 確 保 中
な の か 、 確 保
後 な の か が 分
か ら な い 。 さ
ら に 、 関 数 呼
び 出 し の 最 中
に キ ャ ン セ ル
が 発 生 す る と
、 い く つ か の
内 部 デ ー タ 構
造 (例 え ば 、
malloc(3) 関 連 の 関
数 が 管 理 し て
い る 未 使 用 ブ
ロ ッ ク の リ ン
ク リ ス ト ) が 一
貫 性 の な い 状
態 の ま ま に な
っ て し ま う 可
能 性 が あ る 。
そ の 結 果 、 ク
リ ー ン ア ッ プ
ハ ン ド ラ ー が
役 に 立 た な い
も の に な っ て
し ま う 。 非 同
期 で 安 全 に キ
ャ ン セ ル で き
る 関 数 は
async−cancel−safe functions と
呼 ば れ る 。
POSIX.1−2001 で 、 非 同
期 で 安 全 に キ
ャ ン セ ル で き
る よ う に 求 め
ら れ て い る 関
数 は pthread_cancel(3),
pthread_setcancelstate(),
pthread_setcanceltype() だ け で
あ る 。 一 般 的
に は 、 そ れ 以
外 の ラ イ ブ ラ
リ 関 数 は 、 非
同 期 に キ ャ ン
セ ル で き る ス
レ ッ ド か ら 安
全 に 呼 び 出 す
こ と は で き な
い 。 非 同 期 で
の キ ャ ン セ ル
が 有 効 な 数 少
な い 状 況 と し
て は 、 純 粋 に
計 算 だ け を 行
う ル ー プ に 入
っ て い る ス レ
ッ ド を キ ャ ン
セ ル す る と い
っ た 場 面 が あ
る 。 移 植 性 に
関 す る 注 意
Linux の ス レ ッ ド 実
装 で は 、
pthread_setcancelstate() の oldstate
引 き 数 に NULL を 指
定 す る こ と を
認 め て い る 。 NULL
が 指 定 さ れ た
場 合 、 変 更 前
の cancelability state の 情 報
が 呼 び 出 し 側
に 返 さ れ な い
。 他 の 多 く の
実 装 で も oldstate 引
き 数 に NULL を 指 定
す る こ と を 認
め て い る が 、
POSIX.1−2001 で は こ の
点 に つ い て は
規 定 さ れ て い
な い 。 し た が
っ て 、 移 植 性
が 必 要 な ア プ
リ ケ ー シ ョ ン
で は 常 に oldstate に
NULL 以 外 の 値 を 指
定 す る よ う に
す べ き で あ る
。 pthread_setcanceltype() の
oldtype 引 き 数 に つ
い て も 、 全 く
同 じ こ と が 言
え る 。
例
pthread_cancel(3) を 参 照 。
関 連 項 目
pthread_cancel(3), pthread_cleanup_push(3), pthread_testcancel(3), pthreads(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。