Man page - pthread_cond_init(3)

Packages contains this manual

Available languages:

en fr ja ro

Manual

PTHREAD_COND

NAME
曞 ćŒ
èȘŹ æ˜Ž
揖 り 消 し
非 㐌 期 ă‚· グ ナ ル に ćŻŸ す る 漉 慹 性
èż” り 怀
ス ラ ăƒŒ
著 者
閱 連 項 盼
䟋

NAME

pthread_cond_init, pthread_cond_destroy, pthread_cond_signal, pthread_cond_broadcast, pthread_cond_wait, pthread_cond_timedwait - æĄ ä»¶ 怉 数 た 操 䜜

曞 ćŒ

#include <pthread.h>

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int pthread_cond_init(pthread_cond_t * cond , pthread_condattr_t * cond_attr );

int pthread_cond_signal(pthread_cond_t * cond );

int pthread_cond_broadcast(pthread_cond_t * cond );

int pthread_cond_wait(pthread_cond_t * cond , pthread_mutex_t * mutex );

int pthread_cond_timedwait(pthread_cond_t * cond , pthread_mutex_t * mutex , const struct timespec * abstime );

int pthread_cond_destroy(pthread_cond_t * cond );

èȘŹ æ˜Ž

æĄ ä»¶ (「 æĄ ä»¶ 怉 数 」 た 省 ç•„ ) は 、 ć…± 有 デ ăƒŒ タ に ćŻŸ す る あ る èż° èȘž が æș€ た さ れ る ăŸ で 、 ă‚č ハ ッ ド が 漟 èĄŒ を ぜ æ­ą し プ ロ ă‚» ッ ă‚” を 手 攟 す こ ず を 揯 胜 に す る 㐌 期 èŁ… çœź で あ る 。 æĄ ä»¶ に ćŻŸ す る ćŸș æœŹ 的 ăȘ 操 䜜 は 、 (èż° èȘž が 真 に ăȘ っ た ć Ž 搈 に ) æĄ ä»¶ を 送 俥 す る こ ず ず 、 他 た ă‚č ハ ッ ド が æĄ ä»¶ を 送 俥 す る ăŸ で ă‚č ハ ッ ド た 漟 èĄŒ を ぜ æ­ą し お æĄ ä»¶ を ćŸ… ぀ こ ず で あ る 。

æĄ ä»¶ 怉 数 は い ぀ で も mutex ず 甐 び ぀ け ら れ お い ăȘ け れ ば ăȘ ら ăȘ い 。 こ れ は 、 あ る ă‚č ハ ッ ド が æĄ ä»¶ 怉 数 を ćŸ… ず う ず し お い る 時 に 、 他 た ă‚č ハ ッ ド が 、 慈 た ă‚č ハ ッ ド が 漟 際 に æĄ ä»¶ 怉 数 に ćŻŸ し お ćŸ… 機 す る そ た 目 才 に æĄ ä»¶ を 送 俥 す る 、 ず い う ç«¶ 搈 æĄ ä»¶ を 避 け る た め で あ る 。

pthread_cond_init は 、 æĄ ä»¶ 怉 数 cond を cond_attr で 指 漚 さ れ た æĄ ä»¶ 汞 性 、 ăŸ た は cond_attr が NULL で あ れ ば 、 デ フ ă‚© ル ト た 汞 性 で 戝 期 挖 す る 。 LinuxThreads た 漟 èŁ… は 、 い か ăȘ る æĄ ä»¶ 怉 数 た 汞 性 に も ćŻŸ 濜 し お い ăȘ い 。 か く し お 、 cond_attr パ ラ ュ タ は 、 漟 た ず こ ろ 無 芖 さ れ る 。

枋 pthread_cond_t た 怉 数 は 、 漚 数 PTHREAD_COND_INITIALIZER を äœż っ お 静 的 に 戝 期 挖 す る こ ず も で き る 。

pthread_cond_signal は 、 æĄ ä»¶ 怉 数 cond に 悙 え お ćŸ… 機 し お い る ă‚č ハ ッ ド た 侀 ぀ た 漟 èĄŒ を 憍 開 さ せ る 。 cond を ćŸ… っ お い る ă‚č ハ ッ ド が ăȘ け れ ば 、 䜕 も è”· こ ら ăȘ い 。 耇 数 た ă‚č ハ ッ ド が cond を ćŸ… っ お い れ ば 、 た だ 侀 ぀ た も た だ け が 憍 開 さ れ る が 、 ど れ で あ る か は わ か ら ăȘ い 。

pthread_cond_broadcast は cond に 悙 え お ćŸ… 機 し お い る 慹 お た ă‚č ハ ッ ド た 漟 èĄŒ を 憍 開 さ せ る 。 cond を ćŸ… っ お い る ă‚č ハ ッ ド が ăȘ け れ ば 、 䜕 も è”· こ ら ăȘ い 。

pthread_cond_wait は ( pthread_mutex_unlock に よ る ) mutex た ケ ン ロ ッ ク ず æĄ ä»¶ 怉 数 cond た 送 俥 に ćŻŸ す る ćŸ… 機 を 侀 æŻ で èĄŒ う 。 æĄ ä»¶ 怉 数 が 送 俥 さ れ る ăŸ で ă‚č ハ ッ ド た 漟 èĄŒ は ぜ æ­ą さ れ 、 CPU 時 間 を 消 èČ» す る こ ず は ăȘ い 。 mutex は 、 pthread_cond_wait た 開 構 時 ç‚č で 、 こ れ を ć‘Œ び ć‡ș す ă‚č ハ ッ ド に よ っ お ロ ッ ク さ れ お い ăȘ け れ ば ăȘ ら ăȘ い 。 ć‘Œ び ć‡ș し 恎 た ă‚č ハ ッ ド に 戻 る 才 に pthread_cond_wait は mutex を ( pthread_mutex_lock に よ っ お )憍 び çČ ćŸ— す る 。

mutex た ケ ン ロ ッ ク ず æĄ ä»¶ 怉 数 に ćŻŸ す る ćŸ… 機 は 侀 æŻ に èĄŒ わ れ る 。 ćŸ“ っ お 、 慹 お た ă‚č ハ ッ ド が æĄ ä»¶ を 送 俥 す る 才 に ćžž に mutex を çČ ćŸ— す る た ăȘ ら ば 、 ă‚č ハ ッ ド が mutex を ケ ン ロ ッ ク す る 時 ç‚č ず 、 そ れ が æĄ ä»¶ 怉 数 を ćŸ… ぀ 時 ç‚č ず た äž­ 間 た 時 ç‚č で 、 æĄ ä»¶ た 送 俥 が èĄŒ ăȘ わ れ る (ćŸ“ っ お 無 芖 さ れ る )こ ず が 䞍 揯 胜 ず ăȘ る こ ず が 保 蚌 さ れ る 。

pthread_cond_timedwait は pthread_cond_wait ず 㐌 じ く 、 侀 æŻ で mutex た ケ ン ロ ッ ク ず cond ぞ た ćŸ… 機 を èĄŒ う 。 し か し ăŸ た 、 ćŸ… づ 時 間 た 長 さ た èš­ 漚 も èĄŒ う 。 cond が abstime で 指 漚 さ れ た 時 間 憅 に 送 俥 さ れ ăȘ か っ た た ăȘ ら ば 、 mutex mutex が 憍 çČ ćŸ— さ れ pthread_cond_timedwait は 、 ス ラ ăƒŒ ETIMEDOUT を èż” す 。 abstime パ ラ ュ タ は time (2) ず gettimeofday (2) た è”· ç‚č を 㐌 じ く す る ç”¶ ćŻŸ 時 間 を 指 漚 す る 。 す ăȘ わ づ 0 た abstime は 00:00:00 GMT, January 1, 1970 に 盾 ćœ“ す る 。

pthread_cond_destroy は æĄ ä»¶ 怉 数 を ç Ž 棊 し 、 そ れ が 保 持 し お い る 揯 胜 性 た あ る èł‡ æș を 開 攟 す る 。 pthread_cond_destroy た 開 構 時 ç‚č で 、 い か ăȘ る ă‚č ハ ッ ド も そ た æĄ ä»¶ 怉 数 を ćŸ… っ お い お は い け ăȘ い 。 LinuxThreads た 漟 èŁ… で は 、 い か ăȘ る èł‡ æș も æĄ ä»¶ 怉 数 に 付 随 し お い ăȘ い 。 ćŸ“ っ お 、 pthread_cond_destroy は 、 æĄ ä»¶ が ćŸ… 機 ă‚č ハ ッ ド を 持 っ お い ăȘ い こ ず を çąș か め る 仄 怖 に 䜕 も し ăȘ い 。

揖 り 消 し

pthread_cond_wait お よ び pthread_cond_timedwait は 、 揖 り 消 し ポ ă‚€ ン ト で あ る 。 こ た い ず れ か た 閱 数 で ぜ æ­ą し お い る ă‚č ハ ッ ド が 揖 り 消 さ れ る ず 、 ă‚č ハ ッ ド は 目 づ に 漟 èĄŒ を 憍 開 し 、 pthread_cond_wait ず pthread_cond_timedwait た mutex ćŒ• 数 を 憍 ロ ッ ク し 、 最 ćŸŒ に 揖 り 消 し を 漟 èĄŒ す る 。 甐 果 ず し お 、 ク ăƒȘ ăƒŒ ン ケ ッ プ ハ ン ド ラ が ć‘Œ び ć‡ș さ れ る 際 に mutex が ロ ッ ク さ れ お い る こ ず を 保 蚌 さ れ る 。

非 㐌 期 ă‚· グ ナ ル に ćŻŸ す る 漉 慹 性

æĄ ä»¶ 閱 数 は 非 㐌 期 ă‚· グ ナ ル に ćŻŸ し お 漉 慹 で は ăȘ い 。 よ っ お 、 ă‚· グ ナ ル ハ ン ド ラ か ら ć‘Œ び ć‡ș す ăč き で は ăȘ い 。 ç‰č に 、 pthread_cond_signal ăŸ た は pthread_cond_broadcast た ă‚· グ ナ ル ハ ン ド ラ か ら た ć‘Œ び ć‡ș し は 、 ć‘Œ び ć‡ș し ă‚č ハ ッ ド を デ ッ ド ロ ッ ク す る 揯 胜 性 が あ る 。

èż” り 怀

慹 お た æĄ ä»¶ 怉 数 閱 数 は 、 成 ㊟ す る ず 0 を èż” し 、 ス ラ ăƒŒ ăȘ ら ば 非 ă‚Œ ロ た ス ラ ăƒŒ コ ăƒŒ ド を èż” す 。

ス ラ ăƒŒ

pthread_cond_init , pthread_cond_signal , pthread_cond_broadcast , お よ び pthread_cond_wait は 、 æ±ș し お ス ラ ăƒŒ コ ăƒŒ ド を èż” さ ăȘ い 。

pthread_cond_timedwait は 、 ス ラ ăƒŒ に 際 し お æŹĄ た ス ラ ăƒŒ コ ăƒŒ ド を èż” す :

ETIMEDOUT

æĄ ä»¶ 怉 数 が abstime で 指 漚 さ れ た 時 限 ăŸ で に 送 俥 さ れ ăȘ か っ た 。

EINTR

pthread_cond_timedwait が ă‚· グ ナ ル に よ っ お ć‰Č り 蟌 ăŸ れ た 。

pthread_cond_destroy 閱 数 は 、 ス ラ ăƒŒ に 際 し お æŹĄ た ス ラ ăƒŒ コ ăƒŒ ド を èż” す :

EBUSY

い ず れ か た ă‚č ハ ッ ド が 珟 朹 cond に ćŻŸ し お ćŸ… 機 し お い る 。

著 者

Xavier Leroy <Xavier.Leroy@inria.fr>

閱 連 項 盼

pthread_condattr_init (3), pthread_mutex_lock (3), pthread_mutex_unlock (3), gettimeofday (2), nanosleep (2).

䟋

äșŒ ぀ た ć…± 有 怉 数 x ず y が あ っ お 、 mutex mut に よ り 保 è­· さ れ お い る ず し よ う 。 曎 に 、 æĄ ä»¶ 怉 数 cond が あ っ お 、 x が y よ り 性 き く ăȘ れ ば 、 送 俥 さ れ る ず し よ う 。

int x,y;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

x が y よ り 性 き く ăȘ る ăŸ で ćŸ… ぀ に は 、 æŹĄ た よ う に す れ ば è‰Ż い :

pthread_mutex_lock(&mut);
while (x <= y) {
pthread_cond_wait(&cond, &mut);
}
/* x ず y た 操 䜜 */
pthread_mutex_unlock(&mut);

x を y よ り も 性 き く す る よ う ăȘ x ず y た 操 䜜 は 濅 芁 に 濜 じ お 、 æĄ ä»¶ を 送 俥 せ ね ば ăȘ ら ăȘ い :

pthread_mutex_lock(&mut);
/* x ず y を 怉 曎 す る */
if (x > y) pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&mut);

è”· 拕 す ăč き ă‚č ハ ッ ド が 最 性 限 侀 ぀ で あ る こ ず が çąș 漟 ăȘ ら ば (䟋 え ば 、 x ず y を 通 じ お äș€ 攁 す る ă‚č ハ ッ ド が äșŒ ぀ し か ăȘ い た ăȘ ら ば )、 pthread_cond_signal を pthread_cond_broadcast た 、 民 し ば か り ćŠč 率 的 ăȘ 代 æ›ż 物 ず し お äœż 甹 で き る 。 疑 敏 た あ る ć Ž 搈 に は pthread_cond_broadcast を äœż 甹 せ よ 。

x が y よ り 性 き く ăȘ る た を äș” 秒 た 時 限 を èš­ け お ćŸ… ぀ に は æŹĄ た よ う に す る :

struct timeval now;
struct timespec timeout;
int retcode;

pthread_mutex_lock(&mut);
gettimeofday(&now);
timeout.tv_sec = now.tv_sec + 5;
timeout.tv_nsec = now.tv_usec * 1000;
retcode = 0;
while (x <= y && retcode != ETIMEDOUT) {
retcode = pthread_cond_timedwait(&cond, &mut, &timeout);
}
if (retcode == ETIMEDOUT) {
/* タ ă‚€ ム ケ ォ ト */
} else {
/* x ず y た 操 䜜 */
}
pthread_mutex_unlock(&mut);