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
こ の 実 装 の 大
き な 特 徴 は 以
下 の 通 り で あ
る :
使 っ て
作 成 し た ス レ
ッ ド に 加 え 、
こ の 実 装 で は
「 管 理 (manager)」 ス
レ ッ ド が 作 成
さ れ る 。 管 理
ス レ ッ ド は ス
レ ッ ド の 作 成
と 終 了 を 取 り
扱 う (こ の ス レ
ッ ド が う っ か
り kill さ れ る と 、
問 題 が 起 こ る
こ と が あ る )。
|
− こ の
実 装 で は 内 部
で シ グ ナ ル を
使 用 し て い る
。 |
|
Linux 2.2 以 降
で は 、 リ ア |
ル タ イ
ム シ グ ナ ル の
う ち 最 初 の 3つ
が 使 わ れ る
(signal(7) 参 照 )。 そ
れ 以 前 の カ ー
ネ ル で は SIGUSR1 と
SIGUSR2 が 使 わ れ る
。 ア プ リ ケ ー
シ ョ ン は 、 ス
レ ッ ド 実 装 で
利 用 さ れ て い
る シ グ ナ ル を
ど れ も 使 わ な
い よ う に し な
け れ ば な ら な
い 。
|
− ス レ
ッ ド 間 で プ ロ
セ ス |
|
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/ に 書
か れ て い る 。
| | | |