Cã§ã³ã«ãŒãã³ããžã§ãã¬ãŒã¿ãŒãããã³å調ãã«ãã¿ã¹ã¯ã䜿çšããå¯èœæ§ã¯ãããã°ã©ã ãå€§å¹ ã«ç°¡çŽ åãã匷床ãç¯çŽããããšãã§ããŸããããããã®èšèªæ©èœã¯æããã§ã¯ãªããå€ãã¯ãããã«ã€ããŠç¥ããŸããã
ç¶ç¶ïŒcontionuationïŒã䜿çšãããšãããã°ã©ã ã¹ããªãŒã ïŒé¢æ°ïŒã®å®è¡ç¶æ ãèšæ¶ããå°æ¥ãã®å Žæã«æ»ãããšãã§ããŸãã
æ¡åŒµæ©èœã䜿çšãããšãã»ãšãã©æ¢è£œã®ãžã§ãã¬ãŒã¿ãŒ ã ã€ãã¬ãŒã¿ãŒã å調ãã«ãã¿ã¹ã¯ã§ããã³ã«ãŒãã³ãååŸã§ããŸãã
ãããã®ã¡ãœããã䜿çšããCæ¡åŒµæ©èœãšãµã³ãã«ã©ã€ãã©ãªãå®è£ ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
- ã¢ã»ã³ãã©ãŒæ¿å ¥ïŒcoroã©ã€ãã©ãªãŒïŒããŸãã¯getcontext / setcontextã³ã³ããã¹ãã®ä¿å/埩å ãŸãã¯setjmp / longjmpã¹ã¿ãã¯ïŒlibpclãlibcoroutineãlibconcurrencyãlibcoroã©ã€ãã©ãªãŒïŒã®ä¿å/埩å ã®ããã®æšæºPOSIXé¢æ°ã䜿çšããŠãçŸåšã®ã¹ã¿ãã¯ãšããã»ããµãŒã®ã¬ãžã¹ã¿ãŒãä¿åããŸãã
- switchã¹ããŒãã¡ã³ãã®å·§åŠãªäœ¿çšïŒ ãDuffããã€ã¹ããšããŠç¥ãããŠããŸã ïŒã
ããã¯ãããšãã°ããããã¹ã¬ããã©ã€ãã©ãªïŒ Adam Dunkelsã®æšæºããŒãžã§ã³ ãããã³Larry Ruaneã®æ¡åŒµããŒãžã§ã³ ïŒãPuTTYã®äœè ã§ããSimon Tathamã®ã³ã«ãŒãã³ã©ã€ãã©ãªã§ãã
- GCCæ¡åŒµæ©èœãã¿ã°å€æ°ãïŒãããã¹ã¬ããã©ã€ãã©ãªïŒã
ãã®èšäºã§ã¯ãAdam Dunkelsã®protothreadsã©ã€ãã©ãªãŒã調ã¹ãŸãã ã·ã³ãã«ã§ãããã«ã§ãããã€ãã®ããããŒãã¡ã€ã«ã®ãã¯ãã®ã»ããã§æ§æãããC ++ãšäºææ§ããããŸãã ã©ã€ãã©ãªã«ã¯å¿ èŠãªãã®ããã¹ãŠå«ãŸããŠãããä»ã®ã©ã€ãã©ãªããã©ãããã©ãŒã ãã³ã³ãã€ã©ã«äŸåããŸããã åçã¡ã¢ãªã䜿çšããŸããã gccãããå Žåãã©ã€ãã©ãªã¯å€æ°ã©ãã«ã䜿çšããŠè¿œå æ©èœãæäŸããŸãã äžè¬ã«ããã®ã©ã€ãã©ãªã¯ãããŸããŸãªã¢ãŒããã¯ãã£ãã³ã³ãã€ã©ãããã³ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãããçµã¿èŸŒã¿ã¢ããªã±ãŒã·ã§ã³ã®ããã°ã©ãã³ã°ã«æã䟿å©ã§ããããã«æãããŸããã
ã©ã€ãã©ãªã®åäœæ¹æ³ã«ã€ããŠã¯ããã®Webãµã€ãã§è©³ãã説æãããŠããŸããAPIã®ç°¡åãªèª¬æãšäœ¿çšäŸãããã€ã玹ä»ããŸãã ãã¡ãããã©ã€ãã©ãªã®äœ¿çšã¯åãªããã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãã§ãããããšãã°ã¹ããŒããã·ã³ã䜿çšããŠå®è¡ã§ããŸãïŒå®éãã©ã€ãã©ãªã¯é¢æ°ãæé»çãªã¹ããŒããã·ã³ã«å€æããŸãïŒã ããããå€ãã®ã¿ã¹ã¯ã«ãããŠãã©ã€ãã©ãªã¯ããã°ã©ã ããã¹ãã®éãæžãããçŽç·æ§ãæçæ§ãé«ãããã®çµæãéçºæéãšãšã©ãŒã®å¯èœæ§ãæžããããšãã§ããŸãã ã¹ããŒããã·ã³ã䜿çšããŠåé¡ã解決ããããŒã¹ä»¥äžã®ã¹ããŒããããå Žåããããã®å€ãã¯é çªã«é²ã¿ãŸããã»ãšãã©ã®å Žåããããã¹ã¬ããã¯äººçãå€§å¹ ã«ç°¡çŽ åã§ããŸãã ç§ã®çµéšã§ã¯ããããã¹ã¬ããã䜿çšããããã°ã©ã ã®ãœãŒã¹ã³ãŒãã¯ãã¹ããŒããã·ã³ã䜿çšããŠèšè¿°ãããåçã®ãã®ãããçŽ20ã50ïŒ å°ãªããªããŸãã
ãã®èšäºã®äŸã¯Windowsã§æžãããŠãããMinGWãšVisual Studioã§åäœããŸããã泚æããŠãã ããïŒ Visual Studioã®DEBUGæ§æã§ã¯ãprotothreadsã©ã€ãã©ãªã¯ãã®ãŸãŸã§ã¯ã³ã³ãã€ã«ãããŸããïŒ
çç±ã¯ãVSã®DEBUGæ§æã®__LINE__ãã¯ããäœããã®çç±ã§å®æ°ããé¢æ°åŒã³åºãã«å€ããããã§ããããã¯ãlc-switch.hãã¡ã€ã«ã眮ãæããããå Žåã«ç°¡åã«åŠçãããŸãã
#define LC_SET(s) s = __LINE__; case __LINE__:
ã«
#define LC_SET(s) s = __COUNTER__+1; case (__COUNTER__):
gccã§ã¯ããã¹ãŠã®ãã©ãããã©ãŒã ãšããã»ããµã§ãã©ã€ãã©ãªã¯å€æŽãªãã§æ©èœããŸãã
ã©ã€ãã©ãªã䜿çšããã«ã¯ã.hãã¡ã€ã«ãããŠã³ããŒãããŠãããžã§ã¯ãã«è§£åããããããŒãå«ããå¿ èŠããããŸãã
#include "pt.h"
ããã§ãã©ã€ãã©ãªããäœãåŸãããšãã§ããŸãïŒ
ç¶ç¶
ç¶ç¶èªäœã¯ããŸãæçšã§ã¯ãããŸããããä»ã®ããã°ã©ã æ§é ã®åºç€ãšãªã£ãŠããŸãã
ç¶è¡ããæ©èœãæã€é¢æ°ã¯ã次ã®ããã«å®£èšãããŸãã
int name(struct pt *pt [, ])
ãŸãã¯ã次ã®ãããªãã¯ãã䜿çšããŸãã
PT_THREAD(name(struct pt *pt [, ]))
ptåŒæ°ã¯ç¶ç¶ã³ã³ããã¹ããžã®ãã€ã³ã¿ã§ãããäœããã®æ¹æ³ã§é¢æ°ãäžæãããå Žæãä¿åããŸãã
é¢æ°ã¯ãåç §ã«ãããè¿œå ã®åŒæ°ãä»ããŠçµæãè¿ãããšãã§ããŸãã
ã¹ããŒãã¡ã³ãã®éå§åã«ãã¹ããªãŒã ã®æåŸã«PT_BEGINïŒptïŒ-PT_ENDïŒptïŒããªããã°ãªããŸããã åé¢æ°åŒã³åºãã§ããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠãããå Žåããã¯ãPT_BEGINïŒptïŒã®åã«é 眮ãããŸãã ããã«ã¯ãããšãã°ãã¿ã€ããŒãã«ãŠã³ã¿ãŒãªã©ã®å€ãæŽæ°ããããšãã§ããŸãã
PT_YIELDïŒptïŒã³ãã³ãã¯çµæãè¿ãã次åé¢æ°ãåŒã³åºããããšãé¢æ°ã¯æ¬¡ã®ã¹ããŒãã¡ã³ãããç¶è¡ããŸãã
ã¹ããªãŒã ã®äžæïŒããšãã°ããšã©ãŒã®å ŽåïŒã¯ããã¯ãPT_EXITïŒptïŒã«ãã£ãŠå®è¡ãããŸãã ã¹ããªãŒã ã®æåŸã«å°éããåŸããŸãã¯å²ã蟌ã¿ïŒãã¯ãPT_ENDïŒptïŒããã³PT_EXITïŒptïŒïŒã®åŸã PT_RESTARTïŒptïŒã³ãã³ãã§åèµ·åãããšãé¢æ°ã¯æåã«ãå·»ãæ»ãããã次ã®åŒã³åºãã§åã³åäœãéå§ããŸãã
é¢æ°ã¯å®æ°ãè¿ããŸã-é¢æ°ã®äžæã®çç±ïŒ PT_WAITING-ã€ãã³ããåŸ ã€ã PT_YIELDED-å€ãè¿ã ã PT_EXITED - PT_EXITïŒptïŒ ã³ãã³ãã§çµäºããã PT_ENDED-é¢æ°ãPT_ENDïŒptïŒã®çµããã«éããŸããã
ç¶ç¶ãåããŠäœ¿çšããåã«ã PT_INITïŒptïŒãã¯ãã§ã³ã³ããã¹ããåæåããå¿ èŠããããŸãã
åŒã³åºãéã§å€ãä¿æããå¿ èŠãããå€æ°ã¯ãéçãšããŠå®£èšããããåç §ã«ãã£ãŠé¢æ°ã«æž¡ãå¿ èŠããããŸãã
çºé»æ©
è€éãªã¢ã«ãŽãªãºã ã§ããã€ãã®ããŒã¿ã®ã·ãŒã±ã³ã¹ãååŸããå¿ èŠãããã次ã®åèŠçŽ ãååŸããæ¹æ³ãç¹å®ã®æ¡ä»¶ãšä»¥åã®å€ã«äŸåããå Žåããžã§ãã¬ãŒã¿ãŒã䜿çšãããšäŸ¿å©ã§ãã
ãã£ããããæ°ãçæããäŸã次ã«ç€ºããŸãã
#include "pt.h" #include <stdio.h> static int fib(struct pt *pt, int max, int* res) { static int a,b; PT_BEGIN(pt); a=0;b=1; while (a<max) { *res=a; PT_YIELD(pt); b+=a; a=ba; } PT_END(pt); } int main(void) { int value; struct pt pt1; PT_INIT(&pt1); while( fib(&pt1, 1000, &value) < PT_EXITED ){ printf("Value %d\n",value); } return 0; }
ã³ã«ãŒãã³
å€å žçãªã³ã«ãŒãã³ã¯ãäºãã«å¶åŸ¡ã移ããå²ã蟌ã¿äœçœ®ã«æ»ãããšãã§ããããã°ã©ã ã¹ã¬ããã§ãã ã³ã«ãŒãã³ã¯ãããã€ãã®ããã°ã©ã ãããŒïŒé¢æ°ïŒã®äžã§ãã¡ã€ã³ããã°ã©ã ãšãµãããã°ã©ã ã®éããæ確ã§ãªãå Žåã«äœ¿çšãããŸãïŒKnutããThe Art of Programmingãã®ç¬¬1å·»ïŒã ããšãã°ãããã°ã©ã ã®äžéšãäœããã®åœ¢ã§ããŒã¿ãçæããå¥ã®éšåãäœããã®æ¹æ³ã§ããŒã¿ãæ¶è²»ããŸãã ããã«ãæ¶è²»è ãšã¡ãŒã«ãŒã®äž¡æ¹ãéåžžã«è€éã§ãã ããŒã¿ãããã¥ãŒãµãŒããã°ã©ã ãäœæãããšããããŒã¿ã®æºåãã§ãããé¢æ°ãšããŠããŒã¿æ¶è²»ãåŒã³åºããŸãã ããããããŒã¿ã³ã³ã·ã¥ãŒããããã°ã©ã ãããšãã¯ããã§ã«ã³ã³ã·ã¥ãŒããã¡ã€ã³ããã°ã©ã ã«ããŠãããŒã¿ã®åä¿¡ãšåŠçãå¯èœãªãšãã«çæé¢æ°ãåŒã³åºããããšæã£ãŠããŸãã ãã®å Žåãããã°ã©ã ãšãµãããã°ã©ã ã®é¢ä¿ã®ä»£ããã«ãã³ã«ãŒãã³ãšã³ã«ãŒãã³ã®é¢ä¿ãéåžžã«é©åã§ãã æåã«ã¡ã¢ãªå ã®ãã¹ãŠã®ããŒã¿ãçæãããã®åŸããã«ãã¹ãŠãæ¶è²»ããããšãã§ããŸãããç¹ã«çµã¿èŸŒã¿ã·ã¹ãã ã§ã¯ãã¡ã¢ãªãããå€ãã®ããŒã¿ãååšããå ŽåããããŸãã ã³ã«ãŒãã³ãç¶ç¶ã«ããç°¡åã«ååŸã§ããŸãã
ããšãã°ã倧éã®xmlããŒã¿ãçæããŠããã¢ãŒã«ã€ããããã¡ã€ã«ã«ä¿åãããããããã¯ãŒã¯çµç±ã§è»¢éããå¿ èŠããããŸãã ç°¡åã«ããããã«ãçæãšã¹ãã¬ãŒãžã®ã¿ãå®è£ ããŸãã ã¡ã¢ãªããã³ãã¡ã€ã«æäœã«é¢ããããŸããŸãªãšã©ãŒãã§ãã¯ãçç¥ãããŸãã makeXmlLineã¯åœç€Ÿã®ã¡ãŒã«ãŒã§ãã å ¥åæã解æããåŒã³åºãããšã«XMLæååãçæããŸãã writeXmlLineã¯ã³ã³ã·ã¥ãŒããŒã§ãããåŒã³åºãããšã«è¡ããã¡ã€ã«ã«ä¿åããŸãã ã³ã«ãŒãã³ã¯ãã¡ãŒã«ãŒã®ã³ã«ãŒãã³ãçµäºãããŸã§ïŒçµæPT_EXITEDãè¿ããŸã§ïŒ1ã€ãã€åŒã³åºãããŸãã
#include "pt.h" #include <stdio.h> #include <string.h> #include <malloc.h> static int makeXmlLine(struct pt *pt, char* dst, char* src) { static char* text; // static char * pch; PT_BEGIN(pt); strcpy(dst,"<?xml version=\"1.0\" encoding=\"Windows-1251\"?>"); PT_YIELD(pt); strcpy(dst,"<text>"); PT_YIELD(pt); text=strdup(src); // strtok , pch = strtok (text," ,.!?:"); while (pch != NULL){ sprintf(dst," <word>%s</word>",pch); PT_YIELD(pt); pch = strtok (NULL, " ,.!?:"); } strcpy(dst,"</text>"); PT_YIELD(pt); *dst=0; // , PT_YIELD(pt); free(text); PT_END(pt); } static int writeXmlLine(struct pt *pt, char* fileName, char* str) { static FILE* file; PT_BEGIN(pt); file=fopen(fileName,"w"); // while(*str){ fprintf(file,"%s\n",str); PT_YIELD(pt); } fclose(file); PT_END(pt); } int main(void) { struct pt pt1,pt2; char xmlString[128]; PT_INIT(&pt1); PT_INIT(&pt2); // , while (makeXmlLine(&pt1,xmlString, "Hello, world! Pleased to meet you!") < PT_EXITED) writeXmlLine(&pt2,"file.xml",xmlString); return 0; }
ãã«ãã¿ã¹ã¯
çµã¿èŸŒã¿ã·ã¹ãã ã§ã¯ãããŒãã«å°çããããŒã¿ããããã¡ã解æŸãããã¿ã€ããŒãããªã¬ãŒãããå¥ã®æäœãå®äºããããã¿ã³ãæŒããäžæåæ¢ãªã©ãåžžã«äœããåŸ ã€å¿ èŠããããŸãã ãã«ãã¿ã¹ã¯ã䜿çšãããšãéåæããã°ã©ãã³ã°ã¢ãã«ããåæããã°ã©ãã³ã°ã¢ãã«ã«ç§»è¡ã§ããŸãã ãããé©åãã©ããã¯ãç¶æ³ã«ãã£ãŠç°ãªããŸãã
åçŽãªã¹ã¬ãããããŒãžã£ãŒãšã³ã«ãŒãã³ã䜿çšããŠãå調ãã«ãã¿ã¹ã¯ãç°¡åã«ååŸã§ããŸãã æãåçŽãªã±ãŒã¹ã§ã¯ããã£ã¹ãããã£ãŒã¯ã³ã«ãŒãã³ãé 次åŒã³åºãç¡éã«ãŒãã§ãã ããè€éãªãã£ã¹ãããã£ã®å Žåãã¿ã¹ã¯ã®è¿œå /åé€ãåªå 床ã·ã¹ãã ãªã©ãå®è£ ã§ããŸãã
ã³ã«ãŒãã³ããŒã¹ã®ãã«ãã¿ã¹ã¯ã䜿çšãããšãããªãšã³ããã£ããã«ãã¿ã¹ã¯ããã次ã®å©ç¹ããããŸãã
- ãã¹ãŠã®æäœã¯ã¢ãããã¯ã§ãããããŒã¿ãã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ãšãã¥ãŒããã¯ã¹ã§ä¿è·ããå¿ èŠã¯ãããŸããã ã¹ããªãŒã åæããªããã£ãã¯äžèŠã§ããããåºæ¬çãã€å®å šã«ããã°ã©ã çã«å®è£ ãããŠããŸã
- äœæµéã®ãªãŒããŒãããã ã¹ããªãŒã ããšã®ã¡ã¢ãªæ¶è²»éã¯ããªã¿ãŒã³ãã€ã³ããæ ŒçŽãã2ãã€ãã«å¶éã§ããã¹ããªãŒã ã«ã¯ç¬èªã®ã¹ã¿ãã¯ããããŸããã ã¹ã¬ããéã®åãæ¿ãã¯ããŠãŒã¶ãŒç©ºéã§ã®èªã¿åãããã»ããµåœä»€ãæ§æããŸãã ã¹ã¬ããã®æ°ã¯æ°çŸäžã«ãªããŸã
- è€æ°ã®ã€ãã³ãã®çµã¿åãããçºçãããŸã§ãããŒããããã¯ã§ããŸãã ããšãã°ãããŒã¿ãã±ããã®å°çãã¿ã€ããŒã®åäœããŠãŒã¶ãŒã«ããæäœã®ãã£ã³ã»ã«ããšã©ãŒã®çºçãªã©ã®ã€ãã³ãã®åŸ æ©
- ãããã¯ãããã¹ã¬ããã¯äžæã§ããŸãããéåžžãæšæºã®ãããã¯æäœã¯äžæã§ããŸãã
ãã«ãã¿ã¹ã¯çšã«ãProtothreadsã¯æ¬¡ã®ããªããã£ããæäŸããŸãã
- ç¹å®ã®ã€ãã³ããçºçãããŸã§ã¹ã¬ããããããã¯ãããã¯ãPT_WAIT_UNTILããã³PT_WAIT_WHILE
- ãã¯ãPT_WAIT_THREAD ãå¥ã®ã¹ã¬ãããçµäºãããŸã§ã¹ã¬ãããåæ¢ããŸã
- ãã¯ãPT_SPAWNã¯ãããã¹ã¬ãããå¥ã®ã¹ã¬ãããæåããéå§ããçµäºããã®ãåŸ ã€ããšãèš±å¯ããŸã
- ããªããã£ããããŒãããŒãžã£ã§ãããã¯ãPT_SCHEDULEã¯ã次ã®ã³ã«ãŒãã³ã¹ããããå®è¡ããäœæ¥ãå®äºãããã©ãããè¿ããŸã
- æ§é äœpt_sem ã PT_SEM_INIT ã PT_SEM_WAIT ã PT_SEM_SIGNAL-ã»ããã©ãæäœããããã®ããªããã£ãã¯å®éã«ã¯åœ¹ã«ç«ããªã
å€æ°ã®åäžã®ã¹ããªãŒã ãéå§ããå Žåã¯ãæ§é é¢æ°ãžã®ãªã³ã¯ãã¹ããªãŒã é¢æ°ã«æž¡ããŸããã¹ããªãŒã é¢æ°ã¯ãã¹ããªãŒã ãç¬èªã®ã¹ããªãŒã ã«äœ¿çšãããã¹ãŠã®ããŒã¿ãšå€æ°ãæ ŒçŽããŸãã åäžã¹ã¬ããã®å Žåããã¹ãŠã®å€æ°ãéçãšããŠå®£èšããã ãã§ãé¢æ°å ã«ä¿åã§ããŸãã
ãã«ãã¹ã¬ããã®äŸãšããŠããŠã£ã³ããŠçšã®ã·ã³ãã«ãªã³ã³ãœãŒã«ArkanoidïŒ100è¡åŒ·ïŒãäœæããŸãããã pastebinã®ãã¡ã€ã«ïŒ arkanoid.c
ã©ã±ãããããŒã«ã競æå Žã®3ã€ã®ã¹ããªãŒã ããããŸãã å¥ã®è£å©ãµãã¿ã¹ã¯pauseThreadãäžæåæ¢ããŸãã
ã¹ã±ãžã¥ãŒã©ãŒã¯ç°¡åã§ããåãããŒã«å¶åŸ¡ã移ãã10msã®äŒæ¢ããšããŸãã ããããã®ãããŒãçµäºãããšãã²ãŒã ã¯çµäºããŸãïŒããŒã«ããã£ãŒã«ãããé£ã³åºããããã¹ãŠã®ã¬ã³ã¬ãããã¯ã¢ãŠãã§ããŸãïŒã
while (PT_SCHEDULE(printField(&fieldPt)) && PT_SCHEDULE(controlThr(&ctrlPt)) && PT_SCHEDULE(ballThread(&ballPt))) Sleep(10);
printFieldã¹ããªãŒã ã¯ãæåã«ã¡ã¢ãªå ã«ã²ãŒã ãã£ãŒã«ããäœæããŠãããã«ãŒãå ã§ãã£ãŒã«ãå€æŽãã©ã°ãåŸ æ©ããç»é¢äžã®ãã£ãŒã«ãå šäœãåæç»ããŸãã ããªãã¯ãçµäºãããšããããŒã¯çµäºããŸãã
controlThrã¹ããªãŒã ã¯ãã£ãŒã«ãã«ããããæç»ãããã¿ã³ãæŒãããã®ãåŸ ã£ãŠãããã移åããŸãã ãŸãã¯ããqããæŒããŠã²ãŒã ãäžæããŸãã
pauseThreadã¹ã¬ããã¯ã PT_SPAWNã䜿çšããŠ1ã€ã®ã¿ã¹ã¯ãå¥ã®ã¿ã¹ã¯ããåŒã³åºãäŸã®ããã«äœæããããå¿ èŠãªäžæåæ¢ãç¶æããã ãã§ãã
ballThreadã¹ã¬ããã¯ãæå®ãããé床ã§ãã£ãŒã«ãã暪åã£ãŠããŒã«ãåãããã¬ã³ã¬ãããã¯ã¢ãŠãããå£ãããããè·³ãè¿ããŸãã ããŒã«ããã£ãŒã«ãããé£ã³åºããšããã®ãããŒã¯çµäºããŸãã
ããã«ããã€ãã®ãã³ãïŒ
gccã䜿çšããå Žåãã©ã€ãã©ãªãæ¥ç¶ããåã«ã次ã®ããã«#defineã1ã€å ¥ããããšããå§ãããŸãã
#define LC_INCLUDE "lc-addrlabels.h" #include "pt.h"
ããã«ãããå€æ¡åŒµãšããŠgccã©ãã«ã䜿çšã§ããswitchã¹ããŒãã¡ã³ãå ã§å®è¡ãããŒãäžæããã³åãæ¿ããããšãã§ããŸãã ããããªããšãæ¡åŒµæ©èœèªäœãswitchã¹ããŒãã¡ã³ãã䜿çšããŠæ§ç¯ãããã¹ã€ãããšããŸãæ©èœããŸããã
ã¹ããªãŒã ã®çµäºåŸãèªåçã«åéããããšã«æ³šæããŠãã ããã SCHEDULEã0ãè¿ããåŸãåŒã³åºããåæ¢ããããã¹ããªãŒã ã®æåŸã§æ°žç¶çã«ããã¯ããå¿ èŠããããŸããPT_WAIT_WHILEïŒptã1ïŒ