
ãã¹ã¬ããïŒã¯ããã«ãã»ã¯ã·ã§ã³ãèŠãŠã¿ãŸãããã æåã«ãã¹ã¬ãããã©ã®ããã«æ©èœãããã®ç°¡åãªæŠèŠãèŠãŠãããã¹ã¬ãããã©ã®ããã«äœæããã³å®äºããããã«çŠç¹ãåœãŠãŸãã æåŸã«ãã¢ããªã±ãŒã·ã§ã³èšèšã®2ã€ã®ç°ãªãã¢ãããŒãïŒãã«ãã¹ã¬ãããšãã«ãããã»ã¹ïŒãéžæããéã«èæ ®ãã¹ãããã€ãã®èŠå ãæ€èšããŸãã
29.1ã çãã¬ãã¥ãŒ
ããã»ã¹ãšåæ§ã«ãã¹ã¬ããã¯ãåäžã®ã¢ããªã±ãŒã·ã§ã³å ã§è€æ°ã®äžŠåã¿ã¹ã¯ãåæã«å®è¡ããããã®ã¡ã«ããºã ã§ãã å³ã«ç€ºãããã«ã 29.1ã§ã¯ã1ã€ã®ããã»ã¹ã«è€æ°ã®ã¹ã¬ãããå«ãŸããå ŽåããããŸãã ãããã¯ãã¹ãŠãäºãã«ç¬ç«ããŠåãããã°ã©ã å ã§å®è¡ãããåæå/æªåæåããŒã¿ãšããŒãã»ã°ã¡ã³ããå«ãã°ããŒãã«ã¡ã¢ãªãå ±æããŸãïŒåŸæ¥ã®UNIXããã»ã¹ã¯ãã«ãã¹ã¬ããããã»ã¹ã®ç¹æ®ãªã±ãŒã¹ã§ããã1ã€ã®ã¹ã¬ããã§æ§æãããŸãïŒã
å³ 29.1ããã€ãã®åçŽåãè¡ãããŸãã ç¹ã«ãåã¹ã¬ããã®ã¹ã¿ãã¯ã®å Žæã¯ãå ±æã©ã€ãã©ãªããã³å ±æã¡ã¢ãªé åãšäº€å·®ããå ŽåããããŸãã ã¹ã¬ãããäœæãããã©ã€ãã©ãªãããŒããããã¡ã¢ãªã®å ±éã»ã¯ã·ã§ã³ãã¢ã¿ãããããé åºã«äŸåããŸãã ããã«ãã¹ã¬ããã®ã¹ã¿ãã¯ã®å Žæã¯ãLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ãã£ãŠç°ãªãå ŽåããããŸãã
ããã»ã¹å ã®ã¹ã¬ããã¯åæã«å®è¡ã§ããŸãã ãã«ãããã»ããµã·ã¹ãã ã§ã¯ãã¹ã¬ããã䞊è¡ããŠå®è¡ã§ããŸãã äžæ¹ã®ã¹ã¬ãããI / Oã«ãããããã¯ãããå Žåãããäžæ¹ã®ã¹ã¬ãããåŒãç¶ãåäœããå ŽåããããŸãïŒI / Oå°çšã®å¥ã®ã¹ã¬ãããäœæããæ¹ãçã«ããªã£ãŠããŸããã代æ¿ã®I / Oã¢ãã«ã®æ¹ãé©ããŠããããšããããããŸãã詳现ã«ã€ããŠã¯ã第59ç« ãåç §ããŠãã ããïŒ ã
ç¶æ³ã«ãã£ãŠã¯ãã¹ã¬ãããããã»ã¹ããåªå ãããŸãã è€æ°ã®ããã»ã¹ãäœæããããšã«ããã競äºåã®ããå®è¡ã«å¯ŸããåŸæ¥ã®UNIXã¢ãããŒããæ€èšããŠãã ããã 芪ããã»ã¹ãçä¿¡æ¥ç¶ãåãå ¥ããåã¯ã©ã€ã¢ã³ããšéä¿¡ããåforkïŒïŒåŒã³åºãã§åå¥ã®åããã»ã¹ãäœæãããããã¯ãŒã¯ãµãŒããŒã¢ãã«ã®äŸãèŠãŠã¿ãŸãããïŒã»ã¯ã·ã§ã³56.3ãåç §ïŒã ããã«ãããè€æ°ã®æ¥ç¶ãåæã«æäŸã§ããŸãã éåžžããã®ã¢ãããŒãã¯ããŸãæ©èœããŸãããç¶æ³ã«ãã£ãŠã¯æ¬¡ã®å¶éã«ã€ãªãããŸãã

- ããã»ã¹éã§ã®æ å ±äº€æã«ã¯ç¬èªã®åé¡ããããŸãã 芪ãšåå«ã¯ïŒèªã¿åãå°çšã®ããã¹ãã»ã°ã¡ã³ãã«å ããŠïŒã¡ã¢ãªãå ±æããªããããããŒã¿äº€æã«ã¯äœããã®åœ¢åŒã®ããã»ã¹ééä¿¡ã䜿çšããå¿ èŠããããŸãã
- forkïŒïŒã䜿çšããŠããã»ã¹ãäœæãããšãæ¯èŒçå€ãã®ãªãœãŒã¹ãæ¶è²»ãããŸãã ãµãã»ã¯ã·ã§ã³24.2.2ã§èª¬æããã³ããŒã¢ã³ãã©ã€ãæ¹åŒã䜿çšããŠããã¡ã¢ãªããŒãžããã¡ã€ã«èšè¿°åãæã€ããŒãã«ãªã©ãããŸããŸãªããã»ã¹å±æ§ãè€è£œããå¿ èŠããããŸãã ããã¯ãforkïŒïŒã®åŒã³åºãã«ãŸã ããªãã®æéããããããšãæå³ããŸãã ã¹ã¬ããã¯ããããã®åé¡ã®äž¡æ¹ãåãé€ãã®ã«åœ¹ç«ã¡ãŸãã
- ã¹ããªãŒã éã®æ å ±äº€æã¯ç°¡åã§é«éã§ãã ãããè¡ãã«ã¯ãããŒã¿ãå ±æå€æ°ïŒã°ããŒãã«ãŸãã¯ããŒãïŒã«ã³ããŒããã ãã§ãã ãã ããè€æ°ã®ã¹ã¬ãããåæã«åãæ å ±ãæŽæ°ããããšããç¶æ³ã§çºçããå¯èœæ§ãããåé¡ãåé¿ããã«ã¯ã第30ç« ã§èª¬æãããŠããåææ¹æ³ãé©çšããå¿ èŠããããŸãã
- ã¹ã¬ããã®äœæã¯ããã»ã¹ã®äœæãããæéãããããŸãã-éåžžãå°ãªããšã10åã®ããã©ãŒãã³ã¹ã®åäžããããŸãïŒLinuxã§ã¯ãã¹ã¬ããã¯cloneïŒïŒã·ã¹ãã ã³ãŒã«ã䜿çšããŠå®è£ ãããŸããã¹ã¬ãããšforkïŒïŒã³ãŒã«ã®é床ã®éããè¡š28.3ã«ç€ºããŸãïŒã forkïŒïŒã®å Žåã®ããã«ãçŽæ¥ã³ããŒããã®ã§ã¯ãªããå€ãã®å±æ§ãåçŽã«å ±æããããããã¹ã¬ããäœææé ã¯é«éã§ãã ç¹ã«ãã¡ã¢ãªã®ããŒãžïŒã³ããŒãªã³ã©ã€ãã䜿çšïŒãšããŒãžã®ããããŒãã«ãè€è£œããå¿ èŠã¯ãããŸããã
ã°ããŒãã«ã¡ã¢ãªã«å ããŠãã¹ã¬ããã¯ä»ã®å€ãã®å±æ§ãå ±æããŸãïŒããã¯ãåã ã®ã¹ã¬ããã§ã¯ãªããããã»ã¹å šäœã§å±æ§ãã°ããŒãã«ã§ããå Žåã§ãïŒã ãã®äžã«ã¯ã以äžã«ãªã¹ããããŠããå±æ§ããããŸãã
-ããã»ã¹ãšãã®èŠªã®èå¥åã
-ããã»ã¹ã°ã«ãŒããšã»ãã·ã§ã³ã®èå¥åã
-管ç端æ«ã
-ããã»ã¹è³æ Œæ å ±ïŒãŠãŒã¶ãŒããã³ã°ã«ãŒãèå¥åïŒã
-éããŠãããã¡ã€ã«ãåŠçããŸãã
-fcntlïŒïŒãåŒã³åºããŠäœæãããããã¯ãèšé²ããŸãã
-ä¿¡å·ã®ã¢ã¯ã·ã§ã³ã
-ãã¡ã€ã«ã·ã¹ãã ã«é¢é£ããæ å ±ïŒumaskãçŸåšããã³ã«ãŒããã£ã¬ã¯ããªã
-ã€ã³ã¿ãŒãã«ã¿ã€ããŒïŒsetitimerïŒïŒïŒããã³POSIXã¿ã€ããŒïŒtimer_createïŒïŒïŒã
-System Vã®ã»ããã©ïŒsemadjïŒã®äžæ¢å€ã
-ãªãœãŒã¹ã®å¶éã
-æ¶è²»ãããããã»ããµãŒæéïŒtimesïŒïŒããååŸïŒã
-æ¶è²»ãªãœãŒã¹ïŒgetrusageïŒïŒããååŸïŒã
-å€niceïŒsetpriorityïŒïŒããã³niceïŒïŒã䜿çšããŠèšå®ïŒã
以äžã¯ãåã ã®ã¹ã¬ããã«åºæã®å±æ§ã§ãã
-ãããŒèå¥åïŒã»ã¯ã·ã§ã³29.5ãåç §ïŒã
-ä¿¡å·ãã¹ã¯ã
-ç¹å®ã®ã¹ããªãŒã ã«é¢é£ããããŒã¿ïŒã»ã¯ã·ã§ã³31.3ãåç §ïŒã
-代æ¿ã·ã°ãã«ã¹ã¿ãã¯ïŒsigaltstackïŒïŒïŒã
-å€æ°errnoã
-æµ®åå°æ°ç¹èšå®ïŒenvïŒ3ïŒãåç §ïŒã
-ãªã¢ã«ã¿ã€ã ã®èšç»ããªã·ãŒãšåªå 床ïŒã»ã¯ã·ã§ã³35.2ããã³35.3ãåç §ïŒã
-CPUãã€ã³ãã£ã³ã°ïŒLinuxã«ã®ã¿é©çšãã»ã¯ã·ã§ã³35.4ã§èª¬æïŒã
-æ©èœïŒLinuxã«ã®ã¿é©çšã39ç« ã§èª¬æïŒã
-ã¹ã¿ãã¯ïŒããŒã«ã«å€æ°ãšé¢æ°åŒã³åºãã®ã¬ã€ã¢ãŠãæ å ±ïŒã
å³ã«èŠãããããã« 29.1ãåã ã®ã¹ã¬ããã«é¢é£ãããã¹ãŠã®ã¹ã¿ãã¯ã¯åãä»®æ³ã¢ãã¬ã¹ç©ºéå ã«ãããŸãã ããã¯ãé©åãªãã€ã³ã¿ãŒãæã€ã¹ã¬ããããçžäºã®ã¹ã¿ãã¯ãä»ããŠããŒã¿ã亀æã§ããããšãæå³ããŸãã ããã¯äŸ¿å©ãªå ŽåããããŸãããããŒã«ã«å€æ°ã眮ãããŠããã¹ã¿ãã¯ã®æå¹æéäžã®ã¿æå¹ã§ãããšããäºå®ããçããäŸåé¢ä¿ã解決ããã³ãŒããèšè¿°ããéã«ã¯æ³šæãå¿ èŠã§ãïŒé¢æ°ãå€ãè¿ãå Žåããã®ã¹ã¿ãã¯ã§äœ¿çšãããã¡ã¢ãªã®äžéšã¯æ¬¡ã®é¢æ°åŒã³åºãäžã«åå©çšãããŸã;ã¹ã¬ãããçµäºãããšããã®ã¹ã¿ãã¯ãæ£åŒã«é 眮ãããŠããã¡ã¢ãªéšåãå¥ã®ã¹ã¬ããã§å©çšå¯èœã«ãªããŸãïŒã ãã®äŸåé¢ä¿ã®äžé©åãªåŠçã¯ã远跡ãå°é£ãªãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã
29.2ã Pthreadsããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã®æŠèŠ
1980幎代åŸåãã1990幎代åé ã«ã¯ãã¹ããªãŒã ãæäœããããã®ããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ãããã€ããããŸããã 1995幎ã«ãPOSIX.1 APIã¯POSIXã¹ã¬ããAPIãèšè¿°ããŸãããããã¯åŸã«SUSv3ã®äžéšã«ãªããŸããã Pthreadsããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããã€ãã®æŠå¿µã«åºã¥ããŠããŸãã å®è£ ã«ã€ããŠè©³ãã調ã¹ãªããããããã«ã€ããŠè©³ãã説æããŸãã
Pthreadsã®ããŒã¿å
Pthreadsããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããã€ãã®ããŒã¿åãå®çŸ©ããŸãããã®äžéšãè¡šã«ãªã¹ãããŸãã 29.1ã ãããã®ã»ãšãã©ã«ã€ããŠã¯ã次ã®ããŒãžã§èª¬æããŸãã

SUSv3æšæºã«ã¯ããããã®ããŒã¿åã®è¡šçŸæ¹æ³ã«é¢ãã詳现ãå«ãŸããŠããªããããããŒã¿ãã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããã®ããŒã¿åãäžéæãšèŠãªãå¿ èŠããããŸãã ããã¯ãããã°ã©ã ããããã®ã¿ã€ãã®å€æ°ã®æ§é ãŸãã¯å 容ã«äŸåããŠã¯ãªããªãããšãæå³ããŸãã ç¹ã«ã==æŒç®åã䜿çšããŠãã®ãããªå€æ°ãæ¯èŒããããšã¯ã§ããŸããã
ã¹ããªãŒã ãšerrnoå€æ°
åŸæ¥ã®UNIXããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãerrnoå€æ°ã¯ã°ããŒãã«ã§æŽæ°ã§ãã ãã ããããã¯ãã«ãã¹ã¬ããããã°ã©ã ã«ã¯ååã§ã¯ãããŸããã ã¹ã¬ãããerrnoã°ããŒãã«å€æ°ã«ãšã©ãŒãæžã蟌ãã é¢æ°ãåŒã³åºããå Žåãããã¯é¢æ°ãåŒã³åºããŠerrnoã®å€ããã§ãã¯ããä»ã®ã¹ã¬ããã«èª€è§£ãæãå¯èœæ§ããããŸãã ã€ãŸããçµæã¯ç«¶åç¶æ ã«ãªããŸãã ãããã£ãŠããã«ãã¹ã¬ããããã°ã©ã ã§ã¯ãåã¹ã¬ããã«errnoã®ç¬èªã®ã€ã³ã¹ã¿ã³ã¹ããããŸãã LinuxïŒããã³ã»ãšãã©ã®UNIXå®è£ ïŒã§ã¯ãããã«ããã1ã€ã®ã¢ãããŒãã䜿çšãããŸãïŒerrnoã¯ãã¯ããšããŠå®£èšãããåã ã®ã¹ã¬ããã«åºæã®lvalue圢åŒã®å¯å€å€ãè¿ãé¢æ°åŒã³åºãã«å±éãããŸãïŒlvalueã®å€ã¯å€æŽã®ããã«ã¢ã¯ã»ã¹ã§ãããããåãšåæ§ã«ããã«ãã¹ã¬ããããã°ã©ã ã«errno = valueã®åœ¢åŒã®å²ãåœãŠæäœãèšè¿°ã§ããŸãã
äžèšã®èŠçŽïŒãšã©ãŒå ±åæé ãUNIXããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã§äœ¿çšãããåŸæ¥ã®ã¢ãããŒããšå®å šã«äžèŽããããã«ãerrnoã¡ã«ããºã ãã¹ã¬ããã«çµ±åãããŸããã
Pthreadsã®é¢æ°ã«ãã£ãŠè¿ãããå€
åŸæ¥ãã·ã¹ãã ã³ãŒã«ãšäžéšã®é¢æ°ã¯ãæåãããš0ãè¿ãããšã©ãŒãçºçãããšâ1ãè¿ããŸãã ãšã©ãŒèªäœã瀺ãããã«ãerrnoå€æ°ã䜿çšãããŸãã Pthreadsããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã®é¢æ°ã®åäœã¯ç°ãªããŸãã æåããå Žåã¯0ãè¿ãããŸããããšã©ãŒãããå Žåã¯æ£ã®å€ã䜿çšãããŸãã ããã¯ãåŸæ¥ã®UNIXã·ã¹ãã ã³ãŒã«ã§errnoã«å²ãåœãŠãããšãã§ããå€ã®1ã€ã§ãã
ãã«ãã¹ã¬ããããã°ã©ã ã®errnoãžã®åãªã³ã¯ã¯ãé¢æ°ã®åŒã³åºãã«é¢é£ãããªãŒããŒããããéã¶ãããããã°ã©ã ã¯ãPthreadsããé¢æ°ã«ãã£ãŠè¿ãããå€ããã®å€æ°ã«çŽæ¥å²ãåœãŠãŸããã 代ããã«ã以äžã«ç€ºãããã«ãäžéå€æ°ãšèšºæé¢æ°errExitENïŒïŒïŒãµãã»ã¯ã·ã§ã³3.5.2ãåç §ïŒã䜿çšããŸãã
pthread_t *thread; int s; s = pthread_create(&thread, NULL, func, &arg); if (s != 0) errExitEN(s, "pthread_create");
Pthreadsã®ã³ã³ãã€ã«
Linuxã§ã¯ãPthreadsããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããããã°ã©ã ã¯ãcc -pthreadãã©ã¡ãŒã¿ãŒã䜿çšããŠã³ã³ãã€ã«ããå¿ èŠããããŸãã ãã®ãã©ã¡ãŒã¿ãŒã®ã¢ã¯ã·ã§ã³ã®äžã§ã次ã®ãã®ãåºå¥ã§ããŸãã
- _REENTRANTããªããã»ããµãã¯ãã宣èšãããŠããŸãã ããã«ãããããã€ãã®åå ¥å¯èœïŒåå ¥å¯èœïŒé¢æ°ã®å®£èšã«ã¢ã¯ã»ã¹ã§ããŸãã
- ããã°ã©ã ã¯ãlibpthreadã©ã€ãã©ãªãšãªã³ã¯ãããŸãïŒ-lpthreadãã©ã¡ãŒã¿ãŒãšåçïŒã
ãã«ãã¹ã¬ããããã°ã©ã ã®ç¹å®ã®ã³ã³ãã€ã«ãªãã·ã§ã³ã¯ãå®è£ ïŒããã³ã³ã³ãã€ã©ïŒã«ãã£ãŠç°ãªããŸãã äžéšã®ã·ã¹ãã ïŒTru64ãªã©ïŒãcc-pthreadã䜿çšããŸãããcc -mtã¯Solarisããã³HP-UXã§äœ¿çšãããŸãã
29.3ã ã¹ã¬ããäœæ
ããã°ã©ã ãéå§ããçŽåŸã®æçµããã»ã¹ã¯ããœãŒã¹ãŸãã¯ã¡ã€ã³ãšåŒã°ãã1ã€ã®ã¹ã¬ããã§æ§æãããŸãã ãã®ã»ã¯ã·ã§ã³ã§ã¯ãè¿œå ã®ã¹ã¬ãããäœæããæ¹æ³ãåŠç¿ããŸãã
pthread_createïŒïŒé¢æ°ã¯ãæ°ããã¹ã¬ãããäœæããããã«äœ¿çšãããŸãã

æ°ããã¹ã¬ããã¯ãéå§å€ãšããŠæå®ãããé¢æ°ãåŒã³åºããŠåŒæ°åŒæ°ïŒã€ãŸããstartïŒargïŒïŒãåãå ¥ããããšã§å®è¡ãéå§ããŸãã pthread_createïŒïŒãåŒã³åºããã¹ã¬ããã¯ããã®åŒã³åºãã«ç¶ãã¹ããŒãã¡ã³ããå®è¡ããããšã«ããå®è¡ãç¶ç¶ããŸãïŒããã¯ãã»ã¯ã·ã§ã³28.2ã§èª¬æãããglibcã©ã€ãã©ãªããã®cloneïŒïŒã·ã¹ãã ã³ãŒã«ã®ã©ãããŒé¢æ°ã®åäœã«å¯Ÿå¿ããŸãïŒã
argåŒæ°ã¯void *ãšããŠå®£èšãããŸãã ããã¯ãä»»æã®ã¿ã€ãã®ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãéå§é¢æ°ã«æž¡ãããšãã§ããããšãæå³ããŸãã éåžžãã°ããŒãã«ã¹ããŒã¹ãŸãã¯ããŒãã«ããå€æ°ãæããŸãããNULLå€ã䜿çšããããšãã§ããŸãã starté¢æ°ã«ããã€ãã®åŒæ°ãæž¡ãå¿ èŠãããå Žåããããã®åŒæ°ãåå¥ã®ãã£ãŒã«ããšããŠå«ãæ§é äœãžã®ãã€ã³ã¿ãargãšããŠæäŸã§ããŸãã é©åãªãã£ã¹ãã䜿çšããŠãargãæŽæ°ïŒintïŒãšããŠæå®ããããšãã§ããŸãã
å³å¯ã«èšãã°ãCèšèªã®æšæºã§ã¯ãintãvoid *ã«ãã£ã¹ãããçµæã¯èšè¿°ãããŠããŸããã ãã ããã»ãšãã©ã®ã³ã³ãã€ã©ã¯ãã®æäœãèš±å¯ããäºæž¬å¯èœãªçµæãã€ãŸãint j ==ïŒintïŒïŒïŒvoid *ïŒjïŒãçæããŸãã
starté¢æ°ã«ãã£ãŠè¿ãããå€ãvoid *åã§ãããargåŒæ°ãšããŠè§£éã§ããŸãã 以äžã§ã¯ãpthread_joinïŒïŒé¢æ°ãèŠããšããã®å€ãã©ã®ããã«äœ¿çšãããããããããŸãã
åæã¹ããªãŒã é¢æ°ã«ãã£ãŠè¿ãããå€ãæŽæ°ã«ãã£ã¹ããããšãã¯æ³šæãå¿ èŠã§ãã å®éãã¹ããªãŒã ããã£ã³ã»ã«ããããšãã«è¿ãããPTHREAD_CANCELEDå€ïŒç¬¬32ç« ãåç §ïŒã¯ãéåžžãvoid *ãžã®æŽæ°ãã£ã¹ããšããŠå®è£ ãããŸãã åæé¢æ°ããã®å€ãè¿ãå Žåãpthread_joinïŒïŒãå®è¡ããŠããå¥ã®ã¹ã¬ããã¯ããããã¹ã¬ãããã£ã³ã»ã«éç¥ãšããŠèª€ã£ãŠåãå ¥ããŸãã ã¹ã¬ããã®ãã£ã³ã»ã«ãèš±å¯ããåæé¢æ°ããè¿ãããå€ãšããŠæŽæ°ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¹ã¬ãããæ£åžžã«çµäºãããšãã«ããããã®å€ãPTHREAD_CANCELEDå®æ°ãšäžèŽããªãããšã確èªããå¿ èŠããããŸãïŒçŸåšã®å®è£ ã§PthreadsïŒã ããŒã¿ãã«ã¢ããªã±ãŒã·ã§ã³ãåãããã«åäœããŸãããåäœå¯èœãªãã¹ãŠã®å®è£ ãå¿ èŠã§ãã
ã¹ã¬ããåŒæ°ã¯ãpthread_tåã®ãããã¡ãæããpthread_createïŒïŒã¯ãé¢æ°ãè¿ãåã«ãäœæãããã¹ã¬ããã®äžæã®èå¥åãæžã蟌ã¿ãŸãã ãã®èå¥åã¯ãPthreadãžã®ãããªãåŒã³åºãã§ãã®ã¹ã¬ãããåç §ããããã«äœ¿çšã§ããŸãã
SUSv3æšæºã§ã¯ãã¹ã¬ãããæããããã¡ã¯ãæ°ããã¹ã¬ãããéå§ããåã«åæåããå¿ èŠããªããšæ確ã«èŠå®ãããŠããŸãã ã€ãŸããpthread_createïŒïŒé¢æ°ãæ»ãåã«ãæ°ããã¹ã¬ãããåäœãéå§ã§ããŸãã æ°ããã¹ã¬ãããç¬èªã®èå¥åãååŸããå¿ èŠãããå Žåããã®ããã«pthread_selfïŒïŒé¢æ°ïŒã»ã¯ã·ã§ã³29.5ã§èª¬æïŒã䜿çšããå¿ èŠããããŸãã
attråŒæ°ã¯ãæ°ããã¹ã¬ããã®ããŸããŸãªå±æ§ãå«ãpthread_attr_tãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒã§ãïŒã»ã¯ã·ã§ã³29.8ã«æ»ããŸãïŒã attrãNULLã«èšå®ãããšãããã©ã«ãã®å±æ§ã§ã¹ããªãŒã ãäœæãããŸããããã¯ãæ¬æžã®ã»ãšãã©ã®äŸã§è¡ãããšã§ãã
ããã°ã©ã ã¯ãpthread_createïŒïŒãåŒã³åºããåŸãã¹ã±ãžã¥ãŒã©ãŒãããã»ããµãŒæéãå²ãåœãŠãã¹ã¬ãããèªèããŸããïŒãã«ãããã»ããµãŒã·ã¹ãã ã§ã¯ãäž¡æ¹ã®ã¹ã¬ãããç°ãªãCPUã§åæã«å®è¡ã§ããŸãïŒã ç¹å®ã®èšç»æé ã«æ瀺çã«äŸåããããã°ã©ã ã¯ã24.4é ã§èª¬æããã®ãšåãçš®é¡ã®ç«¶åç¶æ ã®åœ±é¿ãåããŸãã ç¹å®ã®å®è¡é åºãä¿èšŒããå¿ èŠãããå Žåã¯ã第30ç« ã§èª¬æããåææ¹æ³ã®ããããã䜿çšããå¿ èŠããããŸãã
29.4ã ã¹ã¬ããè£å®
ã¹ã¬ããã®å®è¡ã¯ã次ã®ããããã®çç±ã§çµäºããŸãã
- åæé¢æ°ã¯returnã¹ããŒãã¡ã³ããå®è¡ããã¹ããªãŒã ã®æ»ãå€ã瀺ããŸãã
- ã¹ã¬ããã¯pthread_exitïŒïŒé¢æ°ãåŒã³åºããŸãïŒä»¥äžã§èª¬æããŸãïŒã
- ã¹ã¬ããã¯ãpthread_cancelïŒïŒé¢æ°ïŒã»ã¯ã·ã§ã³32.1ãåç §ïŒã䜿çšããŠãã£ã³ã»ã«ãããŸãã
- ã¹ã¬ããã®ãããããexitïŒïŒãåŒã³åºãããã¡ã€ã³ã¹ã¬ãããreturnã¹ããŒãã¡ã³ãïŒmainïŒïŒé¢æ°å ïŒãå®è¡ããŸããããã«ãããããã»ã¹å ã®ãã¹ãŠã®ã¹ã¬ãããå³åº§ã«çµäºããŸãã
pthread_exitïŒïŒé¢æ°ã¯ãåŒã³åºãã¹ã¬ãããçµäºããpthread_joinïŒïŒé¢æ°ã䜿çšããŠå¥ã®ã¹ã¬ããããååŸã§ããæ»ãå€ã瀺ããŸãã
include <pthread.h> void pthread_exit(void *retval);
pthread_exitïŒïŒã®åŒã³åºãã¯ãã¹ã¬ããã®åæé¢æ°å ã§returnã¹ããŒãã¡ã³ããå®è¡ããããšãšåçã§ãããã ããpthread_exitïŒïŒã¯ãåæé¢æ°ã«ãã£ãŠèµ·åãããã³ãŒãããåŒã³åºãããšãã§ããŸãã
retvalåŒæ°ã«ã¯ãã¹ããªãŒã ã«ãã£ãŠè¿ãããå€ãä¿æãããŸãã retvalãæãå€ã¯ãpthread_exitïŒïŒã®åŒã³åºãã®çµäºæã«ãã®å 容ãæªå®çŸ©ã«ãªããããã¹ã¬ããèªäœã®ã¹ã¿ãã¯äžã«ããã¹ãã§ã¯ãããŸããïŒããã»ã¹ã®ä»®æ³ã¡ã¢ãªã®ãã®éšåã¯ãæ°ããã¹ã¬ããã®ã¹ã¿ãã¯ã«ããã«å²ãåœãŠãããŸãïŒã åæé¢æ°ã®returnã¹ããŒãã¡ã³ãã§æž¡ãããå€ã«ã€ããŠãåãããšãèšããŸãã
ã¡ã€ã³ã¹ã¬ãããexitïŒïŒãŸãã¯returnã¹ããŒãã¡ã³ãã®ä»£ããã«pthread_exitïŒïŒãåŒã³åºããå Žåãæ®ãã®ã¹ã¬ããã¯åŒãç¶ãå®è¡ãããŸãã
29.5ã ã¹ããªãŒã èå¥å
ããã»ã¹å ã®åã¹ã¬ããã«ã¯ãç¬èªã®äžæã®èå¥åããããŸãã pthread_createïŒïŒã«ãã£ãŠåŒã³åºãã¹ã¬ããã«è¿ãããŸãã ããã«ãpthread_selfïŒïŒé¢æ°ã䜿çšããŠãã¹ã¬ããã¯ç¬èªã®èå¥åãååŸã§ããŸãã
include <pthread.h> pthread_t pthread_self(void);
åŒã³åºãã¹ã¬ããã®èå¥åãè¿ããŸã
ã¢ããªã±ãŒã·ã§ã³å ã®ãããŒèå¥åã¯ã次ã®ããã«äœ¿çšã§ããŸãã
- Pthreadsã®ããŸããŸãªæ©èœã«é¢äžããŠãå®è¡äžã®ã¹ã¬ãããå€å¥ããŸãã äŸã«ã¯ãé¢æ°pthread_joinïŒïŒãpthread_detachïŒïŒãpthread_cancelïŒïŒãããã³pthread_killïŒïŒãå«ãŸããŸãã ãããã¯ãã¹ãŠããã®ç« ããã³åŸç¶ã®ç« ã§èª¬æãããŠããŸãã
- äžéšã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç¹å®ã®ã¹ããªãŒã ã®èå¥åã䜿çšããŠåçããŒã¿æ§é ã«ã©ãã«ãä»ããããšãçã«ããªã£ãŠããå ŽåããããŸãã ãããã£ãŠãæ§é ã®äœæè ãšãææè ãã決å®ã§ããŸãã ãŸããããŒã¿æ§é ã䜿çšããŠåŸç¶ã®ã¢ã¯ã·ã§ã³ãå®è¡ããã¹ã¬ããã決å®ããããšãã§ããŸãã
pthread_equalïŒïŒé¢æ°ã䜿çšãããšã2ã€ã®ã¹ã¬ããèå¥åã®IDã確èªã§ããŸãã

ããšãã°ãåŒã³åºãã¹ã¬ããã®èå¥åãtidå€æ°ã«æ ŒçŽãããŠããå€ãšäžèŽãããã©ããã確èªããã«ã¯ã次ã®ã³ãŒããèšè¿°ã§ããŸãã
if (pthread_equal(tid, pthread_self()) printf("tid matches self\n");
pthread_tããŒã¿åã¯äžéæãšããŠèªèãããå¿ èŠããããããpthread_equalïŒïŒé¢æ°ã®å¿ èŠæ§ãçããŸãã Linuxã§ã¯ãunsigned longåã§ãããä»ã®ã·ã¹ãã ã§ã¯ããã€ã³ã¿ãŒãŸãã¯æ§é äœã«ããããšãã§ããŸãã
NPTLã©ã€ãã©ãªã§ã¯ãpthread_tã¯å®éã«ã¯unsigned longã«ãã£ã¹ãããããã€ã³ã¿ãŒã§ãã
SUSv3æšæºã§ã¯ãpthread_tåãã¹ã«ã©ãŒã«ããå¿ èŠã¯ãããŸããã æ§é ç©ã§ããå¯èœæ§ããããŸãã ãããã£ãŠãäžèšã®ã¹ããªãŒã èå¥åãåºåããããã®ã³ãŒãã¯ç§»æ€æ§ããããŸããïŒãã ããLinuxãå«ãå€ãã®ã·ã¹ãã ã§æ©èœãããããã°äžã«åœ¹ç«ã¡ãŸãïŒã
pthread_t thr; printf("Thread ID = %ld\n", (long) thr); /* ! */
Linuxã§ã¯ãã¹ã¬ããèå¥åã¯ãã¹ãŠã®ããã»ã¹ã«åºæã§ãã ãã ããä»ã®ã·ã¹ãã ã§ã¯ããã§ã¯ãªãå ŽåããããŸãã SUSv3æšæºã§ã¯ãç¹ã«ãããŒã¿ãã«ã¢ããªã±ãŒã·ã§ã³ã¯ãããã®èå¥åã«äŸåããŠä»ã®ããã»ã¹ã®ã¹ã¬ãããèå¥ããããšã¯ã§ããªããšèŠå®ããŠããŸãã ãŸããpthread_joinïŒïŒé¢æ°ã䜿çšããŠå®äºããã¹ã¬ãããæ¥ç¶ããåŸããŸãã¯åæãããã¹ã¬ãããå®äºããåŸãã¹ããªãŒã ã©ã€ãã©ãªããããã®èå¥åãåå©çšã§ããããšã瀺ããŸãïŒpthread_joinïŒïŒé¢æ°ã«ã€ããŠã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§ãåæãããã¹ã¬ããã¯ã»ã¯ã·ã§ã³29.7ã§èª¬æããŸãïŒã
gettidïŒïŒã·ã¹ãã ã³ãŒã«ïŒLinuxã§ã®ã¿å©çšå¯èœïŒã«ãã£ãŠè¿ãããPOSIXãšéåžžã®ã¹ããªãŒã ã®èå¥åã¯åãã§ã¯ãããŸããã POSIXã¹ã¬ããèå¥åã¯ãã¹ã¬ããã©ã€ãã©ãªã®å®è£ ã«ãã£ãŠå²ãåœãŠãããç¶æãããŸãã éåžžã®ã¹ã¬ããèå¥åã¯gettidïŒïŒãåŒã³åºãããšã§è¿ãããã«ãŒãã«ã«ãã£ãŠå²ãåœãŠãããçªå·ïŒããã»ã¹èå¥åã«é¡äŒŒïŒã§ãã NPTLã©ã€ãã©ãªã¯ã«ãŒãã«ã«ãã£ãŠçºè¡ãããäžæã®ã¹ã¬ããèå¥åã䜿çšããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ãããã«ã€ããŠç¥ãå¿ èŠããªãããšããããããŸãïŒããã«ãããããæäœãããšãç°ãªãã·ã¹ãã éã®ç§»æ€æ§ãã¢ããªã±ãŒã·ã§ã³ãã奪ãããŸãïŒã
29.6ã å®äºããã¹ã¬ããã«åå ãã
pthread_joinïŒïŒé¢æ°ã¯ãthreadåŒæ°ã§æå®ãããã¹ã¬ãããçµäºãããŸã§åŸ æ©ããŸãïŒã¹ã¬ãããæ¢ã«å®äºããŠããå Žåã¯ãããã«æ»ããŸãïŒã ãã®æäœã¯åå ãšåŒã°ããŸãã

retvalåŒæ°ããŒã以å€ã®ãã€ã³ã¿ãŒã§ããå Žåãé¢æ°ã¯ãå®äºããã¹ã¬ããã®æ»ãå€ã®ã³ããŒãã€ãŸããã¹ã¬ãããreturnã¹ããŒãã¡ã³ããå®è¡ãããšãããŸãã¯pthread_exitïŒïŒãåŒã³åºããŠæå®ãããå€ã®ã³ããŒãåãåããŸãã
ãã§ã«æ¥ç¶ãããŠããã¹ã¬ããã®èå¥åã«å¯ŸããŠpthread_joinïŒïŒé¢æ°ãåŒã³åºããšãäºæããªãçµæãçããå¯èœæ§ããããŸãã ããšãã°ãåŸã§äœæãããã¹ã¬ããã«åå ããŠãåãèå¥åãåå©çšã§ããŸãã
ã¹ã¬ãããåæãããŠããªãå ŽåïŒã»ã¯ã·ã§ã³29.7ãåç §ïŒãpthread_joinïŒïŒé¢æ°ã䜿çšããŠã¹ã¬ãããçµåããå¿ èŠããããŸãã ããã«å€±æãããšãå®æããã¹ããªãŒã ã¯ããŸã³ããããã»ã¹ã«é¡äŒŒãããã®ã«ãªããŸãïŒã»ã¯ã·ã§ã³26.2ãåç §ïŒã ãªãœãŒã¹ã®æµªè²»ã«å ããŠãããã¯æ°ããã¹ã¬ãããäœæã§ããªããªããšããäºå®ã«ã€ãªããå¯èœæ§ããããŸãïŒååãªããŸã³ãããããŒãèç©ããå ŽåïŒã
pthread_joinïŒïŒãã¹ã¬ããäžã§å®è¡ããæé ã¯ãããã»ã¹ã®ã³ã³ããã¹ãã§ã®waitpidïŒïŒåŒã³åºãã«äŒŒãŠããŸãã ãããããããã®éã«ã¯é¡èãªéãããããŸãã
retvalåŒæ°ããŒã以å€ã®ãã€ã³ã¿ãŒã§ããå Žåãé¢æ°ã¯ãå®äºããã¹ã¬ããã®æ»ãå€ã®ã³ããŒãã€ãŸããã¹ã¬ãããreturnã¹ããŒãã¡ã³ããå®è¡ãããšãããŸãã¯pthread_exitïŒïŒãåŒã³åºããŠæå®ãããå€ã®ã³ããŒãåãåããŸãã
ãã§ã«æ¥ç¶ãããŠããã¹ã¬ããã®èå¥åã«å¯ŸããŠpthread_joinïŒïŒé¢æ°ãåŒã³åºããšãäºæããªãçµæãçããå¯èœæ§ããããŸãã ããšãã°ãåŸã§äœæãããã¹ã¬ããã«åå ããŠãåãèå¥åãåå©çšã§ããŸãã
ã¹ã¬ãããåæãããŠããªãå ŽåïŒã»ã¯ã·ã§ã³29.7ãåç §ïŒãpthread_joinïŒïŒé¢æ°ã䜿çšããŠã¹ã¬ãããçµåããå¿ èŠããããŸãã ããã«å€±æãããšãå®æããã¹ããªãŒã ã¯ããŸã³ããããã»ã¹ã«é¡äŒŒãããã®ã«ãªããŸãïŒã»ã¯ã·ã§ã³26.2ãåç §ïŒã ãªãœãŒã¹ã®æµªè²»ã«å ããŠãããã¯æ°ããã¹ã¬ãããäœæã§ããªããªããšããäºå®ã«ã€ãªããå¯èœæ§ããããŸãïŒååãªããŸã³ãããããŒãèç©ããå ŽåïŒã
pthread_joinïŒïŒãã¹ã¬ããäžã§å®è¡ããæé ã¯ãããã»ã¹ã®ã³ã³ããã¹ãã§ã®waitpidïŒïŒåŒã³åºãã«äŒŒãŠããŸãã ãããããããã®éã«ã¯é¡èãªéãããããŸãã
- ã¹ããªãŒã ã«ã¯éå±€ããããŸããã ããã»ã¹å ã®ã©ã®ã¹ã¬ãããpthread_joinïŒïŒé¢æ°ã䜿çšããŠãåãããã»ã¹å ã®å¥ã®ã¹ã¬ããã«åå ã§ããŸãã ããšãã°ãã¹ã¬ããAãã¹ã¬ããBãäœæããåŸã§ã¹ã¬ããBãäœæãããšããŸãã ãã®å Žåãã¹ããªãŒã Aã¯ã¹ããªãŒã Bã«åå ã§ããéãåæ§ã§ãã ããã¯ãããã»ã¹éã®éå±€é¢ä¿ãšã¯ç°ãªããŸãã 芪ããã»ã¹ãforkïŒïŒã䜿çšããŠåãäœæããå Žåã圌ãšåœŒã ããwaitïŒïŒåŒã³åºãã䜿çšããŠãã®åãæåŸ ã§ããŸãã pthread_createïŒïŒé¢æ°ãåŒã³åºãã¹ã¬ãããšäœæãããã¹ã¬ããã®éã«ã¯ããã®ãããªé¢ä¿ã¯ãããŸããã
- ãä»»æã®ã¹ã¬ãããã«åå ããããšã¯äžå¯èœã§ãïŒããã»ã¹ã®å ŽåãwaitpidïŒâ1ãïŒstatusãoptionsïŒãåŒã³åºãããšã§ãããè¡ãããšãã§ããŸãïŒã ãŸããéããããã³ã°çµåæäœããããŸããïŒWNOHANGãã©ã°ãæå®ããŠwaitpidïŒïŒãåŒã³åºãã®ãšåæ§ïŒã åæ§ã®çµæã¯ãæ¡ä»¶å€æ°ã䜿çšããŠå®çŸã§ããŸãã ãã®äŸã¯ããµãã»ã¯ã·ã§ã³30.2.4ã«ç€ºãããŠããŸãã
pthread_joinïŒïŒé¢æ°ãç¹å®ã®èå¥åãæã€ã¹ã¬ããã®ã¿ãæ¥ç¶ã§ãããšããå¶éã¯ãæå³çã«äœæãããŸããã ã¢ã€ãã¢ã¯ãããã°ã©ã ãç¥ã£ãŠããã¹ã¬ããã®ã¿ã«åå ãããšãããã®ã§ãã ãä»»æã®ã¹ããªãŒã ã«çµåãããæäœã®åé¡ã¯ãã¹ããªãŒã ã«éå±€ããªããšããäºå®ããçºçããããããã®æ¹æ³ã§ãã©ã€ãã©ãªé¢æ°ïŒã»ã¯ã·ã§ã³30.2ã§èª¬æããæ¡ä»¶å€æ°ã䜿çšããŠäœæããã.4ãæ¢ç¥ã®ã¹ããªãŒã ã®ã¿ãçµåã§ããŸãïŒã ãã®çµæãã©ã€ãã©ãªã¯ãã®ã¹ããŒã¿ã¹ãååŸããããã«ãã®ã¹ããªãŒã ã«åå ã§ããªããªãããã§ã«æ¥ç¶ãããŠããã¹ããªãŒã ã«åå ããããšãããšãšã©ãŒãçºçããŸãã èšãæãããšããä»»æã®ã¹ããªãŒã ãžã®çµåãæäœã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ãžã¥ãŒã«åŒã¢ãŒããã¯ãã£ãšäºææ§ããããŸããã
ããã°ã©ã äŸ
ãªã¹ã29.1ã«ç€ºãããã°ã©ã ã¯ãæ°ããã¹ã¬ãããäœæããŠçµåããŸãã
ãªã¹ã29.1 Pthreadsã©ã€ãã©ãªã䜿çšããç°¡åãªããã°ã©ã
______________________________________________________________threads/simple_thread c #include <pthread.h> #include "tlpi_hdr.h" static void * threadFunc(void *arg) { char *s = (char *) arg; printf("%s", s); return (void *) strlen(s); } int main(int argc, char *argv[]) { pthread_t t1; void *res; int s; s = pthread_create(&t1, NULL, threadFunc, "Hello world\n"); if (s != 0) errExitEN(s, "pthread_create"); printf("Message from main()\n"); s = pthread_join(t1, &res); if (s != 0) errExitEN(s, "pthread_join"); printf("Thread returned %ld\n", (long) res); exit(EXIT_SUCCESS); } ______________________________________________________________threads/simple_thread.c
ãã®ããã°ã©ã ãå®è¡ãããšã次ã®ããã«è¡šç€ºãããŸãã
$ ./simple_thread Message from main() Hello world Thread returned 12
æåã®2è¡ã®åºåé åºã¯ãã¹ã±ãžã¥ãŒã©ã2ã€ã®ã¹ã¬ããã管çããæ¹æ³ã«ãã£ãŠç°ãªããŸãã
29.7ã ã¹ããªãŒã ãåæãã
ããã©ã«ãã§ã¯ãã¹ããªãŒã ã¯çµåå¯èœã§ãã ããã¯ãå®äºãããšãpthread_joinïŒïŒé¢æ°ã䜿çšããŠå¥ã®ã¹ã¬ããããã¹ããŒã¿ã¹ãååŸã§ããããšãæå³ããŸãã ã¹ããªãŒã ã«ãã£ãŠè¿ãããã¹ããŒã¿ã¹ã¯éèŠã§ã¯ãªãå ŽåããããŸãã ã·ã¹ãã ããªãœãŒã¹ãèªåçã«è§£æŸããã¹ã¬ãããçµäºãããã¹ã¬ãããåé€ããå¿ èŠããããŸãã ãã®å Žåãpthread_detachïŒïŒé¢æ°ã䜿çšããŠã¹ã¬ããåŒæ°ã«ã¹ã¬ããIDãæå®ããããšã«ãããã¹ã¬ãããåææžã¿ãšããŠããŒã¯ã§ããŸãã

pthread_detachïŒïŒé¢æ°ã®äœ¿çšäŸã¯ãã¹ã¬ãããããèªäœãåæãã次ã®åŒã³åºãã§ãã
pthread_detach(pthread_self());
ã¹ã¬ãããæ¢ã«åæãããŠããå Žåãpthread_joinïŒïŒé¢æ°ã䜿çšããŠæ»ãã¹ããŒã¿ã¹ãååŸããããšã¯ã§ããŸããã ãŸããåã³ãããã³ã°å¯èœã«ããããšãã§ããŸããã
åæãããã¹ã¬ããã¯ãå¥ã®ã¹ã¬ããã§è¡ãããexitïŒïŒåŒã³åºãããã¡ã€ã³ããã°ã©ã ã§å®è¡ãããreturnã¹ããŒãã¡ã³ãã«å¯ŸããŠèæ§ãæã¡ãŸããã ãããã®ç¶æ³ã®ãããã«ãããŠããæ¥ç¶ãããŠãããã©ããã«é¢ä¿ãªããããã»ã¹å ã®ãã¹ãŠã®ã¹ã¬ããã¯ããã«çµäºããŸãã èšãæãããšãpthread_detachïŒïŒé¢æ°ã¯ãã¹ã¬ãããçµäºããåŸã®åäœã«è²¬ä»»ãè² ããŸãããã¹ã¬ãããçµäºããç¶æ³ã«ã¯è²¬ä»»ãè² ããŸããã
29.8ã ã¹ããªãŒã å±æ§
ã¿ã€ãpthread_attr_tã®pthread_createïŒïŒé¢æ°ã®attråŒæ°ã䜿çšããŠãæ°ããã¹ã¬ãããäœæãããšãã«äœ¿çšãããå±æ§ãæå®ã§ããããšã¯æ¢ã«è¿°ã¹ãŸããã ãããã®å±æ§ïŒè©³çŽ°ã«ã€ããŠã¯ããã®ç« ã®æåŸã«ãªã¹ããããŠãããªã³ã¯ãåç §ïŒã®æ€èšããpthread_attr_tãªããžã§ã¯ããæäœã§ããPthreadã®ããŸããŸãªé¢æ°ã®ãããã¿ã€ãã®èª¿æ»ã¯è¡ããŸããã ãããã®å±æ§ã«ã¯ãã¹ããªãŒã ã¹ã¿ãã¯ã®å Žæãšãµã€ãºããã®ã¹ã±ãžã¥ãŒãªã³ã°ããªã·ãŒãšåªå 床ïŒã»ã¯ã·ã§ã³35.2ãš35.3ã§èª¬æãããŠãããªã¢ã«ã¿ã€ã ã¹ã±ãžã¥ãŒãªã³ã°ããªã·ãŒãšããã»ã¹ã®åªå 床ã«é¡äŒŒïŒãªã©ã®æ å ±ãããã³ã¹ããªãŒã ãæ¥ç¶å¯èœãåææžã¿ãã
ãããã®å±æ§ã®äœ¿çšäŸããªã¹ã29.2ã«ç€ºããŸãããã®äŸã§ã¯ãã¹ã¬ãããäœæããããã®ã¹ã¬ããã¯ãã®åºçŸæã«åæãããŸãïŒãã®åŸã®pthread_detachïŒïŒã®åŒã³åºãã®çµæãšããŠã§ã¯ãããŸããïŒã æåã«ããã®ã³ãŒãã¯ããã©ã«ãå€ã䜿çšããŠå±æ§ã§æ§é ãåæåããåæãããã¹ããªãŒã ãäœæããããã«å¿ èŠãªå±æ§ãèšå®ãããã®æ§é ã䜿çšããŠæ°ããã¹ããªãŒã ãäœæããŸãã äœææé ã®æåŸã«ãå±æ§ãæã€ãªããžã§ã¯ãã¯äžèŠãšããŠåé€ãããŸãã
ãªã¹ã29.2ã åæå±æ§ãæã€ã¹ã¬ããã®äœæ
__________________________________________________ threads/detached_attrib.c #include <pthread.h> #include "tlpi_hdr.h" static void * threadFunc(void *x) { return x; } int main(int argc, char *argv[]) { pthread_t thr; pthread_attr_t attr; int s; s = pthread_attr_init(&attr); /* */ if (s != 0) errExitEN(s, "pthread_attr_init"); s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if (s != 0) errExitEN(s, "pthread_attr_setdetachstate"); s = pthread_create(&thr, &attr, threadFunc, (void *) 1); if (s != 0) errExitEN(s, "pthread_create"); s = pthread_attr_destroy(&attr); /* */ if (s != 0) errExitEN(s, "pthread_attr_destroy"); s = pthread_join(thr, NULL); if (s != 0) errExitEN(s, "pthread_join failed as expected"); exit(EXIT_SUCCESS); } __________________________________________________ threads/detached_attrib.c
29.9ã ã¹ã¬ãããšããã»ã¹ã®æ¯èŒ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åºç€ãšããŠã¹ã¬ãããšããã»ã¹ãéžæããéã«èæ ®ãã¹ãããã€ãã®èŠå ã«ã€ããŠç°¡åã«èª¬æããŸãã ãŸãããã«ãã¹ã¬ããã¢ãããŒãã®å©ç¹ã«ã€ããŠèª¬æããŸãã
- ã¹ã¬ããéã§ããŒã¿ã亀æããã®ã¯ç°¡åã§ãã åãããŒã¿äº€æã§ãããããã»ã¹éã§ããå€ãã®ã³ã¹ããå¿ èŠã§ãïŒããšãã°ãå ±éã¡ã¢ãªã»ã°ã¡ã³ãã®äœæããã€ãã©ã€ã³ã®äœ¿çšãªã©ïŒã
- ã¹ã¬ããã®äœæã¯ãããã»ã¹ã®äœæãããæéãããããŸããã ã¹ã¬ããã¯ãã³ã³ããã¹ãã®åãæ¿ãé床ã®é¢ã§ãã¡ãªããããããŸãã ãã ããã¹ã¬ããã«ã¯ããã»ã¹ãšæ¯èŒããŠç¹å®ã®æ¬ ç¹ããããŸãã
- , , ( 31.1). .
- (, ) , . , .
- åã¹ã¬ããã¯ããã®ããã»ã¹ã®æçµã¢ãã¬ã¹ç©ºéã䜿çšããèœåã競ããŸããç¹ã«ãåã¹ã¬ããã®ã¹ã¿ãã¯ãšããŒã«ã«ã¹ãã¬ãŒãžã¯ãããã»ã¹ã®ä»®æ³ã¡ã¢ãªã®äžéšãæ¶è²»ãããããä»ã®ã¹ã¬ããããã¢ã¯ã»ã¹ã§ããªããªããŸãããŸããã¢ãã¬ã¹ã¹ããŒã¹ã¯éåžžã«å€§ããïŒããšãã°ãx86-32ã¢ãŒããã¯ãã£ã®å Žåã¯3 GBïŒãããã®èŠå ã¯å€§ããªå¶éã«ãªããããã»ã¹ã倧éã®ã¹ã¬ããã倧éã®ã¡ã¢ãªãå¿ èŠãšããã¹ã¬ãããäœæããã®ãå¶éããå¯èœæ§ããããäžæ¹ãåå¥ã®ããã»ã¹ã¯ãRAMã®ãµã€ãºãšã¹ã¯ããé åã®ã¿ã«ãã£ãŠå¶éãããã空ãä»®æ³ã¡ã¢ãªã®å šç¯å²ã䜿çšã§ããŸãã
以äžã¯ãã¹ã¬ãããšããã»ã¹ã®éžæã«åœ±é¿ããå¯èœæ§ã®ããè¿œå ã®ãã€ã³ãã§ãã
- ( , ). 33.2.
- (, ). .
- , (, , , , () ). , , .
29.10. ãŸãšã
ãã«ãã¹ã¬ããããã»ã¹ã§ã¯ãåãããã°ã©ã ã§ç°ãªãã¹ã¬ãããåæã«å®è¡ãããŸãããã¹ãŠã«å ±éã®ã°ããŒãã«å€æ°ãšæããããŸãããããããã«ããŒã«ã«å€æ°çšã®ç¬èªã®åå¥ã®ã¹ã¿ãã¯ããããŸããåãããã»ã¹ã®ç°ãªãã¹ã¬ããããããã»ã¹èå¥åãéããŠãããã¡ã€ã«èšè¿°åãã·ã°ãã«ã¢ã¯ã·ã§ã³ãçŸåšã®ãã£ã¬ã¯ããªããªãœãŒã¹å¶éãªã©ãå€ãã®å±æ§ãå ±æããŸãã
ã¹ã¬ããã®éèŠãªæ©èœã¯ãããã»ã¹ãšæ¯èŒããŠæ å ±ã®äº€æãç°¡åãªããšã§ãããã®ãããäžéšã®ãœãããŠã§ã¢ã¢ãŒããã¯ãã£ã¯ããã«ãããã»ã¹ã¢ãããŒãããããã«ãã¹ã¬ããã¢ãããŒãã®ã»ããåªããŠããŸããããã«ãç¶æ³ã«ãã£ãŠã¯ãã¹ã¬ããã®ããã©ãŒãã³ã¹ãåäžããå ŽåããããŸãïŒããšãã°ãã¹ã¬ããã¯ããã»ã¹ãããéãäœæãããŸãïŒãããã®èŠçŽ ã¯éåžžãã¹ã¬ãããšããã»ã¹ãéžæããå Žåã«äºæ¬¡çã§ãã
pthread_create(). , pthread_exit() ( exit() , ). (, pthread_detach()), pthread_join(), .
»
»
»
20% â Linux