Manpages

名 前

pthreads − POSIX ス レ ッ ド

説 明

POSIX.1 は 、 一 般 に POSIX ス レ ッ ド や Pthreads と し て 知 ら れ る ス レ ッ ド プ ロ グ ラ ミ ン グ の イ ン タ ー フ ェ ー ス 群 (関 数 、 ヘ ッ ダ ー フ ァ イ ル ) を 規 定 し て い る 。 一 つ の プ ロ セ ス は 複 数 の ス レ ッ ド を 持 つ こ と が で き 、 全 て の ス レ ッ ド は 同 じ プ ロ グ ラ ム を 実 行 す る 。 こ れ ら の ス レ ッ ド は 同 じ 大 域 メ モ リ ー (デ ー タ と ヒ ー プ 領 域 ) を 共 有 す る が 、 各 ス レ ッ ド は 自 分 専 用 の ス タ ッ ク (自 動 変 数 ) を 持 つ 。

POSIX.1 は ス レ ッ ド 間 で ど の よ う な 属 性 を 共 有 す る か に つ い て も 定 め て い る (つ ま り 、 こ れ ら の 属 性 は ス レ ッ ド 単 位 で は な く プ ロ セ ス 全 体 で 共 通 で あ る ):

− プ ロ セ ス

ID

− 親 プ ロ セ ス

ID

− プ ロ セ ス グ

ル ー プ ID と セ ッ シ ョ ン ID
− 制 御 端 末
− ユ ー ザ ー ID と グ ル ー プ ID
− オ ー プ ン す

る フ ァ イ ル デ ィ ス ク リ プ タ ー

− レ コ ー ド の ロ ッ ク

(fcntl(3) 参 照 )

− シ グ ナ ル の 配 置

− フ ァ イ ル モ ー ド 作 成

マ ス ク (umask(2))
− カ レ ン ト デ ィ レ ク ト リ (chdir(2)) と ル ー ト デ ィ レ ク ト リ (chroot(2))
− イ ン タ ー バ ル タ イ マ ー (setitimer(2)) と POSIX タ イ マ ー

(timer_create(2))

nice 値 (setpriority(2))

リ ソ ー ス 制 限 (setrlimit(2))

CPU 時 間 (times(2)) と リ ソ ー ス (getrusage(2)) の 消 費 状 況 の 計 測

ス タ ッ ク に つ い て も 、 POSIX.1 は ど の よ う な 属 性 が 個 々 の ス レ ッ ド で 独 立 に 管 理 さ れ る か を 規 定 し て い る :

− ス レ ッ ド

ID (pthread_t デ ー タ 型 )

− シ グ ナ ル マ

ス ク (pthread_sigmask(3))

errno 変 数

代 替 シ グ ナ ル ス タ ッ ク (sigaltstack(2))

− リ ア ル タ イ ム ス ケ ジ ュ ー

リ ン グ の ポ リ シ ー と 優 先 度 (sched(7)) 以 下 の Linux 特 有 の 機 能 も ス レ ッ ド 単 位 で あ る :

− ケ ー パ ビ リ テ ィ

(capabilities(7) 参 照 )

CPU affinity (親 和 度 ) (sched_setaffinity(2))

pthreads 関 数 の 返 り 値 ほ と ん ど の pthreads 関 数 は 成 功 す る と 0 を 返 し 、 失 敗 し た 場 合 エ ラ ー 番 号 を 返 す 。 pthreads 関 数 は errno を セ ッ ト し な い 点 に 注 意 す る こ と 。 POSIX.1−2001 で は 、 エ ラ ー を 返 す 可 能 性 の あ る pthreads 関 数 が エ ラ ー EINTR で 失 敗 す る こ と は 決 し て な い と 規 定 し て い る 。 ス レ ッ ド ID あ る プ ロ セ ス 内 の 各 ス レ ッ ド は (pthread_t 型 の ) 一 意 な ス レ ッ ド 識 別 子 を 持 つ 。 こ の 識 別 子 は 、 pthread_create(3) の 呼 び 出 し 元 に 返 さ れ る 。 ま た 、 ス レ ッ ド は 自 身 の ス レ ッ ド 識 別 子 を pthread_self(3) を 使 っ て 取 得 で き る 。 ス レ ッ ド ID の 一 意 性 が 保 証 さ れ る の は 、 一 つ の プ ロ セ ス 内 に お い て の み で あ る 。 終 了 し た ス レ ッ ド が join さ れ た 後 で は 、 ス レ ッ ド ID は 再 利 用 さ れ る 可 能 性 が あ る 。 ス レ ッ ド ID を 引 き 数 に 取 る 全 て の ス レ ッ ド 関 数 に お い て 、 そ の ID は 呼 び 出 し 元 と 同 じ プ ロ セ ス 内 の 一 つ の ス レ ッ ド を 参 照 す る 。 ス レ ッ ド セ ー フ な 関 数 ス レ ッ ド セ ー フ な 関 数 は 、 複 数 の ス レ ッ ド か ら 同 時 に 呼 び 出 し て も 安 全 な (す な わ ち 、 同 時 に 呼 び 出 さ れ た か に 関 わ ら ず 、 同 じ 結 果 を 返 す ) 関 数 の こ と で あ る 。

POSIX.1−2001 と POSIX.1−2008で は 、 一 部 の 例 外 を 除 き 、 標 準 で 規 定 さ れ て い る 全 て の 関 数 が ス レ ッ ド セ ー フ で あ る こ と を 要 求 し て い る 。 以 下 の 関 数 が 例 外 で あ る 。

asctime()
basename()
catgets()
crypt()
ctermid() (NULL で な い 引 き 数 を 渡 さ れ た 場 合 )
ctime()
dbm_clearerr()
dbm_close()
dbm_delete()
dbm_error()
dbm_fetch()
dbm_firstkey()
dbm_nextkey()
dbm_open()
dbm_store()
dirname()
dlerror()
drand48()
ecvt() [POSIX.1−2001 の み (POSIX.1−2008 で 削 除 さ れ た )]
encrypt()
endgrent()
endpwent()
endutxent()
fcvt() [POSIX.1−2001 の み (POSIX.1−2008 で 削 除 さ れ た )]
ftw()
gcvt() [POSIX.1−2001 の み (POSIX.1−2008 で 削 除 さ れ た )]
getc_unlocked()
getchar_unlocked()
getdate()
getenv()
getgrent()
getgrgid()
getgrnam()
gethostbyaddr() [POSIX.1−2001 の み (POSIX.1−2008 で 削 除 さ れ た )]
gethostbyname() [POSIX.1−2001 の み (POSIX.1−2008 で 削 除 さ れ た )]
gethostent()
getlogin()
getnetbyaddr()
getnetbyname()
getnetent()
getopt()
getprotobyname()
getprotobynumber()
getprotoent()
getpwent()
getpwnam()
getpwuid()
getservbyname()
getservbyport()
getservent()
getutxent()
getutxid()
getutxline()
gmtime()
hcreate()
hdestroy()
hsearch()
inet_ntoa()
l64a()
lgamma()
lgammaf()
lgammal()
localeconv()
localtime()
lrand48()
mrand48()
nftw()
nl_langinfo()
ptsname()
putc_unlocked()
putchar_unlocked()
putenv()
pututxline()
rand()
readdir()
setenv()
setgrent()
setkey()
setpwent()
setutxent()
strerror()
strsignal() [POSIX.1−2008 で 追 加 さ れ た ]
strtok()
system() [POSIX.1−2008 で 追 加 さ れ た ]
tmpnam() (NULL で な い 引 き 数 を 渡 さ れ た 場 合 )
ttyname()
unsetenv()
wcrtomb() (最 後 の 引 き 数 が NULL の 場 合 )
wcsrtombs() (最 後 の 引 き 数 が NULL の 場 合 )
wcstombs()
wctomb()

async−cancel−safe 関 数
async−cancel−safe 関 数 は 、 非 同 期 キ ャ ン セ ル 機 能 が 有 効 に な っ て い る ア プ リ ケ ー シ ョ ン で 安 全 に 呼 び 出 す こ と が で き る 関 数 の こ と で あ る (pthread_setcancelstate(3) を 参 照 )。 以 下 の 関 数 だ け が 、 POSIX.1−2001 と POSIX.1−2008 で async−cancel−safe で な け れ ば な ら な い と さ れ て い る 。

pthread_cancel()
pthread_setcancelstate()
pthread_setcanceltype() 取 り 消 し ポ イ ン ト (cancellation points)

POSIX.1 の 規 定 で は 、 特 定 の 関 数 は 取 り 消 し ポ イ ン ト で な け れ ば な ら ず 、 他 の 特 定 の 関 数 は 取 り 消 し ポ イ ン ト で あ っ て も よ い と さ れ て い る 。 あ る ス レ ッ ド が 取 り 消 し 可 能 で 、 そ の 取 り 消 し 種 別 (cancelability type) が 延 期 (deferred) で 、 そ の ス レ ッ ド に 対 す る 取 り 消 し 要 求 が 処 理 待 ち の 場 合 、 取 り 消 し ポ イ ン ト で あ る 関 数 を 呼 び 出 し た 時 点 で 、 そ の ス レ ッ ド の キ ャ ン セ ル が 行 わ れ る 。

POSIX.1−2001 と POSIX.1−2008 の 両 方 、 も し く は い ず れ か 一 方 で は 、 以 下 の 関 数 は 、 取 り 消 し ポ イ ン ト (cancellation points) で あ る こ と が 必 須 と な っ て い る 。

accept()
aio_suspend()
clock_nanosleep()
close()
connect()
creat()
fcntl() F_SETLKW
fdatasync()
fsync()
getmsg()
getpmsg()
lockf() F_LOCK
mq_receive()
mq_send()
mq_timedreceive()
mq_timedsend()
msgrcv()
msgsnd()
msync()
nanosleep()
open()
openat() [POSIX.1−2008 で 追 加 さ れ た ]
pause()
poll()
pread()
pselect()
pthread_cond_timedwait()
pthread_cond_wait()
pthread_join()
pthread_testcancel()
putmsg()
putpmsg()
pwrite()
read()
readv()
recv()
recvfrom()
recvmsg()
select()
sem_timedwait()
sem_wait()
send()
sendmsg()
sendto()
sigpause() [POSIX.1−2001 only (moves to "may" list in POSIX.1−2008)]
sigsuspend()
sigtimedwait()
sigwait()
sigwaitinfo()
sleep()
system()
tcdrain()
usleep() [POSIX.1−2001 の み (POSIX.1−2008 で 削 除 さ れ た )]
wait()
waitid()
waitpid()
write()
writev()

POSIX.1−2001 と POSIX.1−2008 の 両 方 、 も し く は い ず れ か 一 方 で は 、 以 下 の 関 数 は 、 取 り 消 し ポ イ ン ト (cancellation points) で あ っ て も よ い こ と に な っ て い る 。

access()
asctime()
asctime_r()
catclose()
catgets()
catopen()
chmod() [POSIX.1−2008 で 追 加 さ れ た ]
chown() [POSIX.1−2008 で 追 加 さ れ た ]
closedir()
closelog()
ctermid()
ctime()
ctime_r()
dbm_close()
dbm_delete()
dbm_fetch()
dbm_nextkey()
dbm_open()
dbm_store()
dlclose()
dlopen()
dprintf() [POSIX.1−2008 で 追 加 さ れ た ]
endgrent()
endhostent()
endnetent()
endprotoent()
endpwent()
endservent()
endutxent()
faccessat() [POSIX.1−2008 で 追 加 さ れ た ]
fchmod() [POSIX.1−2008 で 追 加 さ れ た ]
fchmodat() [POSIX.1−2008 で 追 加 さ れ た ]
fchown() [POSIX.1−2008 で 追 加 さ れ た ]
fchownat() [POSIX.1−2008 で 追 加 さ れ た ]
fclose()
fcntl() (cmd 引 き 数 が 何 で あ っ て も )
fflush()
fgetc()
fgetpos()
fgets()
fgetwc()
fgetws()
fmtmsg()
fopen()
fpathconf()
fprintf()
fputc()
fputs()
fputwc()
fputws()
fread()
freopen()
fscanf()
fseek()
fseeko()
fsetpos()
fstat()
fstatat() [POSIX.1−2008 で 追 加 さ れ た ]
ftell()
ftello()
ftw()
futimens() [POSIX.1−2008 で 追 加 さ れ た ]
fwprintf()
fwrite()
fwscanf()
getaddrinfo()
getc()
getc_unlocked()
getchar()
getchar_unlocked()
getcwd()
getdate()
getdelim() [POSIX.1−2008 で 追 加 さ れ た ]
getgrent()
getgrgid()
getgrgid_r()
getgrnam()
getgrnam_r()
gethostbyaddr() [SUSv3 の み (こ の 関 数 は POSIX.1−2008 で 削 除 さ れ て い る )]
gethostbyname() [SUSv3 の み (こ の 関 数 は POSIX.1−2008 で 削 除 さ れ て い る )]
gethostent()
gethostid()
gethostname()
getline() [POSIX.1−2008 で 追 加 さ れ た ]
getlogin()
getlogin_r()
getnameinfo()
getnetbyaddr()
getnetbyname()
getnetent()
getopt() (opterr が 0 以 外 の 場 合 )
getprotobyname()
getprotobynumber()
getprotoent()
getpwent()
getpwnam()
getpwnam_r()
getpwuid()
getpwuid_r()
gets()
getservbyname()
getservbyport()
getservent()
getutxent()
getutxid()
getutxline()
getwc()
getwchar()
getwd() [SUSv3 の み (こ の 関 数 は POSIX.1−2008 で 削 除 さ れ て い る )]
glob()
iconv_close()
iconv_open()
ioctl()
link()
linkat() [POSIX.1−2008 で 追 加 さ れ た ]
lio_listio() [POSIX.1−2008 で 追 加 さ れ た ]
localtime()
localtime_r()
lockf() [POSIX.1−2008 で 追 加 さ れ た ]
lseek()
lstat()
mkdir() [POSIX.1−2008 で 追 加 さ れ た ]
mkdirat() [POSIX.1−2008 で 追 加 さ れ た ]
mkdtemp() [POSIX.1−2008 で 追 加 さ れ た ]
mkfifo() [POSIX.1−2008 で 追 加 さ れ た ]
mkfifoat() [POSIX.1−2008 で 追 加 さ れ た ]
mknod() [POSIX.1−2008 で 追 加 さ れ た ]
mknodat() [POSIX.1−2008 で 追 加 さ れ た ]
mkstemp()
mktime()
nftw()
opendir()
openlog()
pathconf()
pclose()
perror()
popen()
posix_fadvise()
posix_fallocate()
posix_madvise()
posix_openpt()
posix_spawn()
posix_spawnp()
posix_trace_clear()
posix_trace_close()
posix_trace_create()
posix_trace_create_withlog()
posix_trace_eventtypelist_getnext_id()
posix_trace_eventtypelist_rewind()
posix_trace_flush()
posix_trace_get_attr()
posix_trace_get_filter()
posix_trace_get_status()
posix_trace_getnext_event()
posix_trace_open()
posix_trace_rewind()
posix_trace_set_filter()
posix_trace_shutdown()
posix_trace_timedgetnext_event()
posix_typed_mem_open()
printf()
psiginfo() [POSIX.1−2008 で 追 加 さ れ た ]
psignal() [POSIX.1−2008 で 追 加 さ れ た ]
pthread_rwlock_rdlock()
pthread_rwlock_timedrdlock()
pthread_rwlock_timedwrlock()
pthread_rwlock_wrlock()
putc()
putc_unlocked()
putchar()
putchar_unlocked()
puts()
pututxline()
putwc()
putwchar()
readdir()
readdir_r()
readlink() [POSIX.1−2008 で 追 加 さ れ た ]
readlinkat() [POSIX.1−2008 で 追 加 さ れ た ]
remove()
rename()
renameat() [POSIX.1−2008 で 追 加 さ れ た ]
rewind()
rewinddir()
scandir() [POSIX.1−2008 で 追 加 さ れ た ]
scanf()
seekdir()
semop()
setgrent()
sethostent()
setnetent()
setprotoent()
setpwent()
setservent()
setutxent()
sigpause() [POSIX.1−2008 で 追 加 さ れ た ]
stat()
strerror()
strerror_r()
strftime()
symlink()
symlinkat() [POSIX.1−2008 で 追 加 さ れ た ]
sync()
syslog()
tmpfile()
tmpnam()
ttyname()
ttyname_r()
tzset()
ungetc()
ungetwc()
unlink()
unlinkat() [POSIX.1−2008 で 追 加 さ れ た ]
utime() [POSIX.1−2008 で 追 加 さ れ た ]
utimensat() [POSIX.1−2008 で 追 加 さ れ た ]
utimes() [POSIX.1−2008 で 追 加 さ れ た ]
vdprintf() [POSIX.1−2008 で 追 加 さ れ た ]
vfprintf()
vfwprintf()
vprintf()
vwprintf()
wcsftime()
wordexp()
wprintf()
wscanf() 実 装 時 に 、 標 準 規 格 で 規 定 さ れ て い な い そ の 他 の 関 数 を 取 り 消 し ポ イ ン ト と す る こ と も 認 め ら れ て い る 。 特 に 、 停 止 (block) す る 可 能 性 が あ る 非 標 準 の 関 数 を 取 り 消 し ポ イ ン ト と す る 実 装 は あ り 得 る こ と だ ろ う (フ ァ イ ル を 扱 う 可 能 性 の あ る ほ と ん ど の 関 数 が こ れ に 含 ま れ る )。

Linux で の コ ン パ イ ル
Linux で は 、 Pthreads API を 用 い た プ ロ グ ラ ム は cc −pthread で コ ン パ イ ル す べ き で あ る 。

POSIX ス レ ッ ド の Linux で の 実 装 こ れ ま で 、 2つ の ス レ ッ ド の 実 装 が Linux の GNU C ラ イ ブ ラ リ に よ り 提 供 さ れ て き た 。
LinuxThreads
最 初 の Pthreads の 実 装 。 glibc 2.4 以 降 は 、 こ の 実 装 は も は や サ ポ ー ト さ れ て い な い 。
NPTL
(Native POSIX Threads Library) 新 し い Pthreads の 実 装 。 LinuxThreads と 比 べ る と 、 NPTL は POSIX.1 の 要 求 仕 様 へ の 準 拠 の 度 合 い が 高 く 、 多 数 の ス レ ッ ド を 作 成 し た 際 の 性 能 も 高 い 。 NPTL は glibc 2.3.2 以 降 で 利 用 可 能 で あ る 。 NPTL を 利 用 す る に は Linux 2.6 カ ー ネ ル に 実 装 さ れ て い る 機 能 が 必 要 で あ る 。 ど ち ら の 実 装 も い わ ゆ る 1:1 実 装 、 す な わ ち 個 々 の ス レ ッ ド が カ ー ネ ル の ス ケ ジ ュ ー リ ン グ 実 体 に マ ッ ピ ン グ さ れ る 。 ど ち ら の ス レ ッ ド の 実 装 も Linux の clone(2) シ ス テ ム コ ー ル を 利 用 し て い る 。 NPTL で は 、 ス レ ッ ド 同 期 の 基 本 機 構 (mutex や ス レ ッ ド の join 等 ) は Linux の futex(2) シ ス テ ム コ ー ル を 使 っ て 実 装 さ れ て い る 。

LinuxThreads こ の 実 装 の 大 き な 特 徴 は 以 下 の 通 り で あ る :

− メ イ ン ス レ ッ ド

(最 初 の ス レ ッ ド ) と プ ロ グ ラ ム が pthread_create(3)

使 っ て 作 成 し た ス レ ッ ド に 加 え 、 こ の 実 装 で は 「 管 理 (manager)」 ス レ ッ ド が 作 成 さ れ る 。 管 理 ス レ ッ ド は ス レ ッ ド の 作 成 と 終 了 を 取 り 扱 う (こ の ス レ ッ ド が う っ か り kill さ れ る と 、 問 題 が 起 こ る こ と が あ る )。

− こ の 実 装 で は 内 部 で シ グ ナ ル を 使 用 し て い る 。

Linux 2.2 以 降 で は 、 リ ア

ル タ イ ム シ グ ナ ル の う ち 最 初 の 3つ が 使 わ れ る (signal(7) 参 照 )。 そ れ 以 前 の カ ー ネ ル で は SIGUSR1SIGUSR2 が 使 わ れ る 。 ア プ リ ケ ー シ ョ ン は 、 ス レ ッ ド 実 装 で 利 用 さ れ て い る シ グ ナ ル を ど れ も 使 わ な い よ う に し な け れ ば な ら な い 。

− ス レ ッ ド 間 で プ ロ セ ス

ID を 共 有 し な い (実 際 に は LinuxThreads の ス レ ッ

ド は 通 常 よ り は 情 報 を 共 有 す る プ ロ セ ス と し て 実 装 さ れ て い る が 、 一 つ の 共 通 の プ ロ セ ス ID を 共 有 し て は い な い )。 (管 理 ス レ ッ ド を 含 む ) LinuxThreads ス レ ッ ド は ps(1) を 使 う と 別 の プ ロ セ ス の よ う に 見 え る 。

LinuxThreads の 実 装 で は POSIX.1 仕 様 か ら 逸 脱 し て い る 点 が い く つ か あ る 。 以 下 に 示 す よ う な 点 が あ る :

getpid(2) を 呼 び 出 し た と き に 、 ス レ ッ ド 毎 に 異 な る 値 が 返 さ れ る 。

メ イ ン ス レ ッ ド 以 外 の ス レ ッ ド で getppid(2) を 呼 び 出 す と 、 管 理 ス レ ッ ド の プ ロ セ ス ID が 返 さ れ る 。 本 当 は 、 こ れ ら の ス レ ッ ド で getppid(2) を 呼 ん だ 場 合 に は メ イ ン ス レ ッ ド で の getppid(2) と 同 じ 値 が 返 る べ き で あ る 。

あ る ス レ ッ ド が fork(2) を 使 っ て 新 し い 子 プ ロ セ ス を 作 成 し た 場 合 、 ど の ス レ ッ ド で も こ の 子 プ ロ セ ス を wait(2) で き る べ き で あ る 。 し か し な が ら 、 こ の 実 装 で は 子 プ ロ セ ス を 作 成 し た ス レ ッ ド だ け が こ の 子 プ ロ セ ス を wait(2) で き る 。

あ る ス レ ッ ド が execve(2) を 呼 び 出 し た 場 合 、 他 の ス レ ッ ド は 全 て 終 了 さ れ る (POSIX.1 の 仕 様 通 り )。 し か し な が ら 、 新 し い プ ロ セ ス は execve(2) を 呼 ん だ ス レ ッ ド と 同 じ PID を 持 つ 。 正 し く は メ イ ン ス レ ッ ド と 同 じ PID を 持 つ べ き で あ る 。

ス レ ッ ド 間 で ユ ー ザ ー ID と グ ル ー プ ID が 共 有 さ れ な い こ の こ と は 、 set−user−ID プ ロ グ ラ ム で 面 倒 な 事 態 を 招 い た り 、 ア プ リ ケ ー シ ョ ン が seteuid(2) な ど を 使 っ て 信 用 情 報 (credentials) を 変 更 し た 場 合 に Pthreads 関 数 が 失 敗 す る 原 因 と な る 。

ス レ ッ ド 間 で 共 通 の セ ッ シ ョ ン ID や プ ロ セ ス グ ル ー プ ID を 共 有 し な い 。
− ス レ ッ ド 間 で fcntl(2) を 使 っ て 作 成 さ れ る レ コ ー ド ロ ッ ク を 共 有 し な

い 。

times(2)getrusage(2) が 返 す 情 報 が プ ロ セ ス 全 体 の 情 報 で な く ス レ ッ ド 単 位 の 情 報 で あ る 。

ス レ ッ ド 間 で セ マ フ ォ の ア ン ド ゥ 値 (semop(2) 参 照 ) を 共 有 し な い 。
− ス レ ッ ド 間 で イ ン タ ー バ ル タ イ マ ー を

共 有 し な い 。

− ス レ ッ ド は 共 通 の

nice 値 を 共 有 し な い 。

POSXI.1 で は 、 全 体 と し て の プ ロ セ ス に 送 ら れ る シ グ ナ ル と 、 個 別 の ス レ ッ ド に 送 ら れ る シ グ ナ ル を 区 別 し て 考 え て い る 。 POSIX.1 に よ る と 、 プ ロ セ ス に 送 ら れ た シ グ ナ ル (例 え ば kill(2) を 使 っ て 送 る ) は 、 そ の プ ロ セ ス に 属 す ス レ ッ ド の う ち 勝 手 に (arbitrarily) に 選 択 さ れ た 一 つ の ス レ ッ ド に よ り 処 理 さ れ る こ と に な っ て い る 。 LinuxThreads は プ ロ セ ス に 送 ら れ る シ グ ナ ル の 概 念 に 対 応 し て お ら ず 、 シ グ ナ ル は 特 定 の ス レ ッ ド に だ け 送 る こ と が で き る 。

− ス レ ッ ド は そ れ ぞ れ の 独 自 の 代 替 シ グ ナ ル ス タ ッ ク の 設 定 を 持 つ 。 し か し 、 新 し い ス レ ッ ド の 代 替 シ グ ナ ル ス タ ッ ク の 設 定 は そ の ス レ ッ ド を 作 成 し た ス レ ッ ド か ら コ ピ ー さ れ 、 そ の た め ス レ ッ ド は 最 初 は 一 つ の 代 替 シ グ ナ ル ス タ ッ ク を 共 有 す る 。

(仕 様 で は 、 新 し い ス レ ッ ド は 代 替 シ グ ナ ル ス タ ッ ク が 定 義 さ れ て い な い 状 態 で 開 始 さ れ る べ き と さ れ て い る 。 2つ の ス レ ッ ド が 共 有 さ れ て い る 代 替 シ グ ナ ル ス タ ッ ク 上 で 同 時 に シ グ ナ ル の 処 理 を 行 っ た 場 合 、 予 測 不 可 能 な プ ロ グ ラ ム の エ ラ ー が 起 こ り 得 る 。 )

NPTL
NPTL で は 、 一 つ の プ ロ セ ス の 全 て の ス レ ッ ド は 同 じ ス レ ッ ド グ ル ー プ に 属 す る ; ス レ ッ ド グ ル ー プ の 全 メ ン バ ー は 同 じ PID を 共 有 す る 。 NPTL は 管 理 ス レ ッ ド (manager thread) を 利 用 し な い 。 NPTL は 内 部 で リ ア ル タ イ ム シ グ ナ ル の う ち 最 初 の 2つ の 番 号 を 使 用 し て お り (signal(7) 参 照 )、 こ れ ら の シ グ ナ ル は ア プ リ ケ ー シ ョ ン で は 使 用 で き な い 。

NPTL に も POSIX.1 に 準 拠 し て い な い 点 が 少 な く と も 一 つ あ る :

− ス レ ッ ド は 共 通 の

nice 値 を 共 有 し な い 。

NPTL の 標 準 非 準 拠 な 点 の う ち い く つ か は 以 前 の カ ー ネ ル で の み 発 生 す る :

times(2)getrusage(2) が 返 す 情 報 が プ ロ セ ス 全 体 の 情 報 で な く ス レ ッ ド 単 位 の 情 報 で あ る (カ ー ネ ル 2.6.9 で 修 正 さ れ た )。

ス レ ッ ド 間 で リ ソ ー ス 制 限 を 共 有 し な い (カ ー ネ ル 2.6.10 で 修 正 さ れ た )。

ス レ ッ ド 間 で イ ン タ ー バ ル タ イ マ ー を 共 有 し な い (カ ー ネ ル 2.6.12 で 修 正 さ れ た )。

メ イ ン ス レ ッ ド だ け が setsid(2) を 使 っ て 新 し い セ ッ シ ョ ン を 開 始 す る こ と が で き る (カ ー ネ ル 2.6.16 で 修 正 さ れ た )。

メ イ ン ス レ ッ ド だ け が setpgid(2) を 使 っ て そ の プ ロ セ ス を プ ロ セ ス グ ル ー プ リ ー ダ ー に す る こ と が で き る (カ ー ネ ル 2.6.16 で 修 正 さ れ た )。

ス レ ッ ド は そ れ ぞ れ の 独 自 の 代 替 シ グ ナ ル ス タ ッ ク の 設 定 を 持 つ 。 し か し 、 新 し い ス レ ッ ド の 代 替 シ グ ナ ル ス タ ッ ク の 設 定 は そ の ス レ ッ ド を 作 成 し た ス レ ッ ド か ら コ ピ ー さ れ 、 そ の た め ス レ ッ ド は 最 初 は 一 つ の 代 替 シ グ ナ ル ス タ ッ ク を 共 有 す る (カ ー ネ ル 2.6.16 で 修 正 さ れ た )。

NPTL の 実 装 で は 以 下 の 点 に つ い て も 注 意 す る こ と :

− ス タ ッ ク サ イ ズ の リ ソ ー ス の ソ フ ト リ ミ ッ ト

(setrlimit(2) の

RLIMIT_STACK の 説 明 を 参 照 ) が unlimited 以 外 の 値 に 設 定 さ れ て い る 場 合 、 ソ フ ト リ ミ ッ ト の 値 が 新 し い ス レ ッ ド の デ フ ォ ル ト の ス タ ッ ク サ イ ズ と な る 。 設 定 を 有 効 に す る た め に は 、 プ ロ グ ラ ム を 実 行 す る 前 に リ ミ ッ ト 値 を 設 定 し て お か な け れ ば な ら な い 。 た い て い は 、 シ ェ ル の 組 み 込 み コ マ ン ド の ulimit −s (C シ ェ ル で は limit stacksize) を 使 っ て 設 定 す る 。 ス レ ッ ド 実 装 の 判 定

glibc 2.3.2 以 降 で は 、 getconf(1) コ マ ン ド を 使 っ て 、 シ ス テ ム の ス レ ッ ド 実 装 を 判 定 す る こ と が で き る 。 以 下 に 例 を 示 す :

bash$ getconf GNU_LIBPTHREAD_VERSION
NPTL 2.3.4 ぞ れ 以 前 の glibc の バ ー ジ ョ ン で は 、 以 下 の よ う な コ マ ン ド で デ フ ォ ル ト の ス レ ッ ド 実 装 を 判 定 す る こ と が で き る 。

bash$ $( ldd /bin/ls | grep libc.so | awk '{print $3}' ) | \
egrep −i 'threads|ntpl'
Native POSIX Threads Library by Ulrich Drepper et al ス レ ッ ド の 実 装 の 選 択 : LD_ASSUME_KERNEL

LinuxThreads と NPTL の 両 方 を サ ポ ー ト し て い る glibc (glibc 2.3.x) が あ る シ ス テ ム で は 、 LD_ASSUME_KERNEL 環 境 変 数 を 使 う こ と で 、 動 的 リ ン カ ー が デ フ ォ ル ト で 選 択 す る ス レ ッ ド 実 装 を 上 書 き す る こ と が で き る 。 こ の 変 数 に よ り 、 動 的 リ ン カ ー が 特 定 の バ ー ジ ョ ン の カ ー ネ ル 上 で 動 作 し て い る と 仮 定 す る よ う に 指 定 す る 。 NPTL が 必 要 と す る サ ポ ー ト 機 能 を 提 供 し て い な い カ ー ネ ル バ ー ジ ョ ン を 指 定 す る こ と で 、 強 制 的 に LinuxThreads を 使 う こ と が で き る (こ の よ う な こ と を す る 最 も あ り そ う な 場 面 は 、 LinuxThreads の 標 準 非 準 拠 な 振 舞 い に 依 存 す る (壊 れ た ) ア プ リ ケ ー シ ョ ン を 動 作 さ せ る 場 合 だ ろ う )。 以 下 に 例 を 示 す :

bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \
awk '{print $3}' ) | egrep −i 'threads|nptl'
linuxthreads−0.10 by Xavier Leroy

関 連 項 目

clone(2), futex(2), gettid(2), futex(7), sigevent(7), signal(7),

pthreads の 各 種 マ ニ ュ ア ル ペ ー ジ 、 例 え ば : pthread_attr_init(3), pthread_atfork(3), pthread_cancel(3), pthread_cleanup_push(3), pthread_cond_signal(3), pthread_cond_wait(3), pthread_create(3), pthread_detach(3), pthread_equal(3), pthread_exit(3), pthread_key_create(3), pthread_kill(3), pthread_mutex_lock(3), pthread_mutex_unlock(3), pthread_once(3), pthread_setcancelstate(3), pthread_setcanceltype(3), pthread_setspecific(3), pthread_sigmask(3), pthread_sigqueue(3), and pthread_testcancel(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。