 |
Technote 1071
Working with Multiprocessing Services
Apple É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API DžǬǢǃ
Apple É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™É^ÉXÉNÇΔåƒÇŒÇÍÇÈé¿çsÇÃìΔóßǵÇΩÉXÉåÉbÉhÇçÏê¨Ç∑ÇÈDZÇΔÇâ¬î\Ç…Ç∑ÇÈåƒÇ—èoǵÇÃÉZÉbÉgÇíÒãüǵNjÇ∑ÅBÉ^ÉXÉNÇÕÅAÉVÉXÉeÉÄì‡Ç≈égópâ¬î\Ç»ÉvÉçÉZÉbÉTè„Ç≈ÉvÉäÉGÉìÉvÉeÉBÉuÇ…ÉXÉPÉWÉÖÅ[ÉãÇ≥ÇÍÇ‹Ç∑ÅBDZÇÍÇÕÅAégópâ¬î\Ç»ÉvÉçÉZÉbÉTÇ™àÍǬǵǩǻǢèÍçáLJìØólÇ≈Ç∑ÅBÉ^ÉXÉNÇÕÅAÉVÉXÉeÉÄÉÅÉÇÉäDžǬǢǃÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔìØólÇÃÉrÉÖÅ[ÇéùÇøÇ‹Ç∑ÅB
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ë„ÇÌǡǃèàóùÇé¿çsÇ∑ÇÈÇΩÇflÇ…égópÇ∑ÇÈÉ^ÉXÉNÇçÏê¨ÇµÇ‹Ç∑ÅBÉ}ÉãÉ`ÉvÉçÉZÉbÉTÉVÉXÉeÉÄÇ≈ÇÕÅAÉ^ÉXÉNÇ…ÇÊǡǃèàóùÇÕìØéûÇ…é¿çsÇ≥ÇÍÇÈÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèàóùÇÃÉXÉãÅ[ÉvÉbÉgÇÕîÚñÙìIÇ…å¸è„ǵNjÇ∑ÅB
ÇΩÇΔǶnjÅAÉCÉÅÅ[ÉWèàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAÉCÉÅÅ[ÉWÉfÅ[É^ÇÃîCà”ÇÃÉuÉçÉbÉNÇïœå`Ç∑ÇÈÉ^ÉXÉNÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉÜÅ[ÉUÇ™ÉCÉÅÅ[ÉWÇÃïœå`ÇëIëÇ∑ÇÈÇΔÇ´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉfÅ[É^Çï°êîÇÃè¨Ç≥Ç»ïîï™Ç…ï™äÑǵÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ™àÍǬÇÃïîï™Çïœå`Ç∑ÇÈÇÊǧDžóvãÅǵNjÇ∑ÅBDZÇÃÉvÉçÉZÉXÇÕÅAÇ∑Ç◊ǃÇÃïîï™Ç™ïœå`Ç≥ÇÍÇÈÇ‹Ç≈åJÇËï‘Ç≥ÇÍÇ‹Ç∑ÅBǪÇÍǺÇÍÇÃïîï™ÇÕìØéûÇ…èàóùÇ≥ÇÍÇÈÇΩÇflÅAÉCÉÅÅ[ÉWëSëÃÇïœçXÇ∑ÇÈÇÃÇ…óvÇ∑ÇÈéûä‘ÇÕîÒèÌÇ…íZèkÇ≥ÇÍÇ‹Ç∑ÅB
ï ÇÃó·ÇΔǵǃÇÕäJî≠ä¬ã´Ç™Ç†ÇËÇ‹Ç∑ÅBäJî≠ä¬ã´Ç≈ÇÕÅAÉ^ÉXÉNÇégǡǃÅAàŸÇ»ÇÈï°êîÇÃÉtÉ@ÉCÉãÇÉRÉìÉpÉCÉãÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÃï˚ñ@ÇégǧÇΔÅAï°êîÇÃÉtÉ@ÉCÉãÇìØéûÇ…ÉRÉìÉpÉCÉãÇ≈Ç´ÇÈÇΩÇflÅAÉvÉçÉWÉFÉNÉgÇÃÉrÉãÉhÇ…óvÇ∑ÇÈéûä‘ÇÕëÂïùÇ…íZèkÇ≥ÇÍÇ‹Ç∑ÅB
É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇÃégÇ¢ï˚
ÉâÉCÉuÉâÉäÇÃégÇ¢ï˚
É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇégópÇ∑ÇÈÇ…ÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇÉvÉçÉWÉFÉNÉgÇ…í«â¡ÇµÇƒÅAé„Ç¢ÉäÉìÉNÇê›íËǵNjÇ∑ÅBMetrowerks
Ç≈ÉâÉCÉuÉâÉäÇΔé„Ç¢ÉäÉìÉNÇê›íËÇ∑ÇÈÇ…ÇÕÅAÉvÉçÉWÉFÉNÉgÉEÉBÉìÉhÉEÇÃÉâÉCÉuÉâÉäñºÇÃó◊DždžÇÈÉvÉãÉ_ÉEÉìÉÅÉjÉÖÅ[ÇégópǵÅAÅgweak
linkÅhÇëIëǵNjÇ∑ÅBDZÇÃëÄçÏÇ…ÇÊÇËÅAÉâÉCÉuÉâÉäÇ™ë∂ç›ÇµÇ»Ç¢èÍçáÇ≈LJÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕãNìÆÇ≥ÇÍÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅB
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃêÊì™ãflÇ≠Ç≈ÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇÃë∂ç›ÇÉeÉXÉgǵǃÇ≠ÇæÇ≥Ç¢ÅBDZÇÃèàóùÇçsǧÉtÉ@ÉCÉãÇ…ÇÕÅAMP.h
ÉtÉ@ÉCÉãÇÉCÉìÉNÉãÅ[ÉhǵNjÇ∑ÅBÉâÉCÉuÉâÉäÇÃë∂ç›ÇÉeÉXÉgÇ∑ÇÈÇ…ÇÕÅAMPLibraryIsLoaded
ÇåƒÇ—èoǵNjÇ∑ÅBMPLibraryIsLoaded ÇÕÅAÉâÉCÉuÉâÉäÇÃÉGÉìÉgÉäÉ|ÉCÉìÉgÇÃÇ¢Ç∏ÇÍÇ©ÇÃë∂ç›ÇÉeÉXÉgÇ∑ÇÈÉ}ÉNÉçÇ≈Ç∑ÅBMPLibraryIsLoaded
ÇÃñflÇËílÇ™ True ÇÃèÍçáÅAÉâÉCÉuÉâÉäÇÕë∂ç›ÇµÅAǪÇÃÉTÅ[ÉrÉXÇégópÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBñflÇËílÇ™
False ÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÉTÅ[ÉrÉXÇåƒÇ—èoÇ∑DZÇΔÇ»Ç≠é¿çsÇ≥ÇÍÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
çÏê¨Ç∑ÇÈÉ^ÉXÉNêîÇÃåàíË
ÉVÉXÉeÉÄì‡ÇÃÉvÉçÉZÉbÉTêîÇÉJÉEÉìÉgÇ∑ÇÈÇ…ÇÕ MPProcessors ÇégópǵNjÇ∑ÅBÉvÉçÉZÉbÉTÇ™àÍǬǵǩǻǢèÍçáÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÉTÅ[ÉrÉXÇ™égópâ¬î\Ç≈ǻǢǩÇÃÇÊǧDžèàóùÇë±çsǵNjÇ∑ÅBÇΩÇæÇµÅAïKóvÇ»èÍçáÇÕÅAÉVÉìÉOÉãÉvÉçÉZÉbÉTä¬ã´Ç≈LJÉvÉäÉGÉìÉvÉeÉBÉuÇ»É^ÉXÉNÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
MPProcessors Ç©ÇÁï‘Ç≥ÇÍÇΩÉJÉEÉìÉgÇÕÅAí èÌÅAçÏê¨Ç∑ÇÈÉ^ÉXÉNêîÇÃéwïWÇΔǵǃégópǵNjÇ∑ÅBçÏê¨Ç∑ÇÈÉ^ÉXÉNêîÇåàíËÇ∑ÇÈÇ…ÇÕÇ¢Ç≠ǬǩÇÃóvàˆÇ™ë∂ç›ÇµÇ‹Ç∑ÅB
Ç‹Ç∏ëÊàÍÇÃóvàˆÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Ç∑Ç◊ǃÇÃÉvÉçÉZÉbÉTÇÉrÉWÅ[Ç»èÛë‘Džǵë±ÇØÇÊǧÇΔÇ∑ÇÈǩǫǧǩÇ≈Ç∑ÅBDZÇÍÇçsǧÇΩÇflÇÃç≈LJä»íPÇ»ï˚ñ@ÇÕÅAè≠Ç»Ç≠ÇΔLJÉvÉçÉZÉbÉTÇΔìØêîÇÃÉ^ÉXÉNÇçÏê¨Ç∑ÇÈDZÇΔÇ≈Ç∑ÅBDZǧÇ∑ÇÍÇŒÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕèàóùÇǪÇÃêîÇÃïîï™Ç…ï™äÑǵÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ™àÍǬÇÃïîï™ÇèàóùÇ∑ÇÈDZÇΔÇóvãÅǵNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAèàóùÇë±çsÇ∑ÇÈëOÇ…ÅAÉ^ÉXÉNÇ™èIóπÇ∑ÇÈÇÃÇë“ÇøÇ‹Ç∑ÅBÉ^ÉXÉNÇ™Ç∑Ç◊ǃÇÃïîï™ÇèIóπÇ∑ÇÈÇΩÇflÇ…
1/10 ïbà»è„ÇóvÇ∑ÇÈèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉ^ÉXÉNÇÃäÆóπÇë“ǬàÍï˚Ç≈ÅAÉCÉxÉìÉgÇÃÉ`ÉFÉbÉNÇçsǡǃÇ≠ÇæÇ≥Ç¢ÅB
è„ÇÃï˚ñ@ÇÃë„ópÇΔǵǃïpî…Ç…çÃópÇ≥ÇÍÇÈÉeÉNÉjÉbÉNÇÕÅAë∂ç›Ç∑ÇÈÉvÉçÉZÉbÉTÇÃêîÇÊÇËLJàÍǬè≠ǻǢÉ^ÉXÉNÇçÏê¨Ç∑ÇÈÇΔǢǧï˚ñ@Ç≈Ç∑ÅBDZÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕèàóùÇÉvÉçÉZÉbÉTÇΔìØêîÇÃïîï™Ç…ï™äÑǵNjÇ∑ÅBǪÇÍǺÇÍÇÃÉ^ÉXÉNÇÕàÍǬÇÃïîï™ÇèàóùÇ∑ÇÈÇÊǧDžóvãÅÇ≥ÇÍÅAécÇ≥ÇÍÇΩïîï™ÇÕÉÅÉCÉìÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™íºê⁄èàóùǵNjÇ∑ÅBèàóùÇ™èIóπÇ∑ÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉ^ÉXÉNÇ™èIóπÇ∑ÇÈÇÃÇë“ÇøÇ‹Ç∑ÅBèàóùÇ™ìKêÿÇ…ìôï™Ç…ï™äÑÇ≥ÇÍǃǢÇÈèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ë“ã@ÇäJénÇ∑ÇÈéûì_Ç≈ÅAÉ^ÉXÉNÇÕèIóπǵǃǢÇÈÇ©ÅAÇŸÇ⁄èIóπǵÇÊǧÇΔǵǃǢÇÈÇÕÇ∏Ç≈Ç∑ÅBDZÇÃÉAÉvÉçÅ[É`ÇÕÅAÉVÉìÉOÉãÉvÉçÉZÉbÉTä¬ã´Ç…óeà’Ç…àÍî âªÇ≈Ç´ÇÈÇΩÇflîÒèÌÇ…êlãCǙdžÇËÇ‹Ç∑ÅBǬNjÇËÅAçÏê¨Ç≥ÇÍÇÈÉ^ÉXÉNÇÃêîÇÉ[ÉçÇ…Ç∑ÇÈÇΔÅAìñëRÇÃDZÇΔǻǙÇÁÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ç≈èIìIÇ…Ç∑Ç◊ǃÇÃèàóùÇé¿çsÇ∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅBÇ‹ÇΩÅADZÇÃÉAÉvÉçÅ[É`ÇÕÅAâΩÇÁÇ©ÇÃóùóRÇ≈É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API ÉâÉCÉuÉâÉäÇ™égópÇ≈ǴǻǢÇΔǴDžǵÇΩǙǧåoòHÇ≈LJdžÇËÇ‹Ç∑ÅBDZÇÃÇΔÇ´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕèàóùÇÃé¿çsDžǩǩÇÌÇÈÇΩÇflÅAèàóùÇÃé¿çsÇ…óvÇ∑ÇÈéûä‘Ç
1/10 ïbñ¢ñûÇ…êßå¿Ç∑ÇÈDZÇΔÇ™èdóvÇ…Ç»ÇËÇ‹Ç∑ÅBDZǧÇ∑ÇÍÇŒÅAÉCÉxÉìÉgÇÃÉ`ÉFÉbÉNÇè\ï™Ç»ïpìxÇ≈é¿çsÇ∑ÇÈDZÇΔÇ™Ç≈Ç´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕǪÇÃê”îCÇâ ÇΩÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
è„ÇÃÉPÅ[ÉXÇ≈ÇÕÅAÇ∑Ç◊ǃÇÃÉ^ÉXÉNǙǟÇ⁄ìØÇ∂èàóùÇé¿çsÇ∑ÇÈDZÇΔÇ™ëOíÒDžǻǡǃǢNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìǙNjǡÇΩÇ≠àŸÇ»ÇÈÉ^ÉCÉvÇÃèàóùÇé¿çsÇ∑ÇÈÉ^ÉXÉNÇçÏê¨Ç∑ÇÈèÍçáÅAçÏê¨Ç∑ÇÈÉ^ÉXÉNÇÃêîÇÕÅAé¿çsÇ∑ÇÈïKóvÇÃdžÇÈèàóùÇÃÉ^ÉCÉvÇ…ÇÊǡǃNjǡÇΩÇ≠àŸÇ»ÇËÇ‹Ç∑ÅBóØà”Ç∑Ç◊Ç´èdóvÇ»É|ÉCÉìÉgÇÕÅAÉvÉçÉZÉbÉTÇÇ≈Ç´ÇÈǩǨÇËÉrÉWÅ[Džǵë±ÇØÇÈDZÇΔÇ≈Ç∑ÅBDZÇÍÇçsǧDžÇÕÅAÉXÉãÅ[ÉvÉbÉgÇç≈ëÂâªÇµÇÊǧÇΔÇ∑ÇÈä‘ÇÕÅAè≠Ç»Ç≠ÇΔLJÉvÉçÉZÉbÉTÇΔìØêîÇÃÉ^ÉXÉNÇ™ä÷ó^Ç∑ÇÈÇÊǧDžǵNjÇ∑ÅB4
ÉvÉçÉZÉbÉTÉVÉXÉeÉÄLJàÍî âªÇµÇ¬Ç¬Ç†ÇËÇ‹Ç∑Ç™ÅAè´óàÇÕÇ≥ÇÁÇ…ã≠óÕÇ»ÉVÉXÉeÉÄÇÃìoèÍÇ™ó\ëzÇ≥ÇÍÇ‹Ç∑ÅB
É^ÉXÉNÇΔÇÃÉfÅ[É^ÇÃÇ‚ÇËéÊÇË
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔÉ^ÉXÉNÇΔÇÃä‘ÇÃÉfÅ[É^ÇÃÇ‚ÇËéÊÇËÇÕÅAã§óLÉÅÉÇÉäÇ®ÇÊÇ—ìØä˙ÉÅÉ\ÉbÉhÇΔǢǧ
2 ǬÇÃäÓñ{ìIÇ»ï˚ñ@Ç≈é¿çsÇ≥ÇÍÇ‹Ç∑ÅBÇ∑Ç◊ǃÇÃÉÅÉÇÉäÇÕã§óLÇ≥ÇÍǃǢÇÈÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉÅÉÇÉäÇ…èëÇ´çûÇÒÇæÉfÅ[É^ÇÕÇ∑Ç◊ǃÉ^ÉXÉNÇ©ÇÁLJégópÇ≈Ç´Ç‹Ç∑ÅBÇ‡ÇøÇÎÇÒDZÇÃãtLJâ¬î\Ç≈Ç∑ÅBǵǩǵÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃópà”Ç≥ÇÍÇΩÉÅÉÇÉäÇ…ÉAÉNÉZÉXÇ∑ÇÈëOÇ…ÅAÉ^ÉXÉNÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API ÉâÉCÉuÉâÉäÇ≈égópâ¬î\Ç» 3 ǬÇÃÉÅÉ\ÉbÉhÇÃÇ¢Ç∏ÇÍÇ©ÇégǡǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔìØä˙Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÃDZÇΔÇÕîÒèÌÇ…èdóvÇ≈Ç∑ÅBPowerPC
ÉAÅ[ÉLÉeÉNÉ`ÉÉÇ≈ÇÕÅAÉÅÉÇÉäÇ÷ÇÃèëÇ´çûÇ›ÇíxâÑÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBDZÇÍÇÕÅAPowerPC ÇÃîÒèÌÇ…çÇë¨Ç»èàóùë¨ìxÇé¿åªÇ∑ÇÈÇΩÇflÇ…ñóßǬÉäÉ\Å[ÉXä«óùã@î\ÇÃàÍǬÇ≈Ç∑ÅBï ÇÃÉvÉçÉZÉbÉTÇ™ÉÅÉÇÉäì‡ÇÃê≥ǵǢílÇì«Ç›çûÇ›ÇΩÇflÇ…ÇÕÅAdžÇÈéÌÇÃÉnÅ[ÉhÉEÉFÉAÇ…àÀë∂ǵÇΩñΩóflÇé¿çsÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉ^ÉXÉNÇ™ìØä˙ÉÅÉ\ÉbÉhÇégópÇ∑ÇÈÇΔÇ´ÅADZÇÍÇÁÇÃñΩóflÇ™é¿çsÇ≥ÇÍÅAǪÇÍà»ç~ÅAèàóùÇ…ä÷ó^Ç∑ÇÈÉvÉçÉZÉbÉTÇÕämé¿Ç…àÍä—ǵÇΩÉÅÉÇÉäÇÃÉrÉÖÅ[ÇéùǬÇÊǧDžǻÇËÇ‹Ç∑ÅBâΩÇÁÇ©ÇÃóùóRÇ≈ÉRÉ~ÉÖÉjÉJÉìÉgÇÃÇ¢Ç∏ÇÍÇ©Ç≈ìØä˙Ç∑ÇÈÇΩÇflÇÃèÄîıÇ™Ç‹ÇæêÆÇ¡ÇƒÇ¢Ç»Ç¢ÇΔÇ´Ç…ÅAëºÇÃÉRÉ~ÉÖÉjÉJÉìÉgǙǪÇÍÇ…ëŒÇ∑ÇÈÉvÉçÉZÉbÉTÇ…èàóùÇè˜ìnÇ≈Ç´ÇÈÇÊǧDžÇ∑ÇÈÇΩÇflDžLJÅAìØä˙ÉÅÉ\ÉbÉhÇégópÇ∑ÇÈDZÇΔÇÕèdóvÇ≈Ç∑ÅBDZÇÍÇ…ÇÊÇËÅAÉvÉçÉZÉbÉTÇÕë¶ç¿Ç…ëºÇÃÉ^ÉXÉNÇ≈LJégópâ¬î\Ç…Ç»ÇËÅALJǡÇΔå¯ó¶ìIÇ…ÉvÉçÉZÉbÉTÇégópÇ∑ÇÈDZÇΔÇ™â¬î\Ç…Ç»ÇËÇ‹Ç∑ÅB
É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇ≈égópâ¬î\Ç»ìØä˙ÉÅÉ\ÉbÉhÇÕÅAQueue ÅASemaphore ÅAÇ®ÇÊÇ—
Critical Region Çà 3 ǬÇ≈Ç∑ÅB
Queue ÇÕÅA96 ÉrÉbÉgÇÃÉÅÉbÉZÅ[ÉWÇ©ÇÁÇ»ÇÈêÊì¸ÇÍêÊèoǵÇÃÉLÉÖÅ[Ç≈Ç∑ÅBóvëfÇÃë}ì¸ÇΔíäèoÇÕÉAÉgÉ~ÉbÉNÉIÉyÉåÅ[ÉVÉáÉìÇ≈džÇËÅAëΩêîÇÃÉ^ÉXÉNÇ™ó^ǶÇÁÇÍÇΩÉLÉÖÅ[Ç©ÇÁéüÇÃÉÅÉbÉZÅ[ÉWÇíäèoǵÇÊǧÇΔééÇ›ÇÈDZÇΔÇÕÇ≈Ç´Ç‹Ç∑Ç™ÅAê≥èÌÇ…éüÇÃÉÅÉbÉZÅ[ÉWÇéÊìæÇ≈Ç´ÇÈÇÃÇÕàÍǬÇÃÉ^ÉXÉNÇæÇØÇ≈Ç∑ÅB
Semaphore ÇÕÅAíPàÍÇà 32 ÉrÉbÉgílÇï\ǵÅADZÇÃílÇÕdžÇÁÇ©Ç∂ÇflíËã`Ç≥ÇÍǃǢÇÈç≈ëÂêîÇ‹Ç≈ÉAÉgÉ~ÉbÉNÇ…ÉCÉìÉNÉäÉÅÉìÉgÇ≥ÇÍÅAÇ‹ÇΩÇÕç≈è¨ílÇÃÉ[ÉçÇ‹Ç≈ÉAÉgÉ~ÉbÉNÇ…ÉfÉNÉäÉÅÉìÉgÇ≥ÇÍÇ‹Ç∑ÅB
Critical Region ÇÕÅAǪÇÍÇÁÇ™àÕÇÒÇ≈Ç¢ÇÈÉRÅ[ÉhÇÃÉZÉNÉVÉáÉìÇ™ï°êîÇÃÉ^ÉXÉNÇ‹ÇΩÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃìØéûÇ…é¿çsÇ≥ÇÍǻǢÇÊǧDžǵNjÇ∑ÅB
É^ÉXÉNÇçÏê¨Ç∑ÇÈëOÇ…ÅAí èÌÇÕÅAǪÇÍÇÁÇìØä˙Ç≥ÇπÇÈÇΩÇflÇÃï˚ñ@ÇçÏê¨Ç∑ÇÈDZÇΔÇÇ®ä©ÇflǵNjÇ∑ÅBQueue
ÇΔ Semaphore ÇÕÅAç≈LJàÍî ìIÇ…égópÇ≥ÇÍÇÈ 2 ǬÇÃÉÅÉ\ÉbÉhÇ≈Ç∑ÅBÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇ…ÇΔÇËǩǩÇÎǧÇΔÇ∑ÇÈêlÇÕÅAàÍî Ç…
Queue ÇégópǵNjÇ∑ÅBDZÇÍÇÕÅAQueue Ç™îÒèÌÇ…è_ìÓÇ≈ÅAǩǬî‰ärìIóùâǵǂÇ∑Ç¢ÇΩÇflÇ≈Ç∑ÅBSemaphore
ÇÕ Queue ÇΔî‰ärÇ∑ÇÈÇΔÅAÇÊÇËçÇë¨Ç≈ÉÅÉÇÉäÇ…ëŒÇ∑ÇÈïââ◊LJè¨Ç≥Ç¢Ç≈Ç∑Ç™ÅAìØíˆìxÇÃè_ìÓê´ÇíÒãüÇ∑ÇÈDZÇΔÇÕdžÇËÇ‹ÇπÇÒÅBQueue
ÇΔ Semaphore ÇÕÅAí èÌÉyÉAÇ≈çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBǬNjÇËÅAàÍï˚Ç™ÉäÉNÉGÉXÉgÇÃÉVÉOÉiÉãÇëóÇËÅALJǧàÍï˚Ç™åãâ ÇÃÉVÉOÉiÉãÇëóÇËÇ‹Ç∑ÅBèâêSé“Ç™îΔÇµÇ™ÇøÇ»åÎÇËÇÕ
(DZÇÍÇÕíòé“ÇÃåoå±Ç©ÇÁåæÇ¶ÇÈDZÇΔÇ≈Ç∑Ç™)ÅAàÍï˚ÇÃìØä˙ÉIÉuÉWÉFÉNÉgÇæÇØÇçÏê¨ÇµÅAóºï˚ÇÃñ⁄ìIÇ≈ǪÇÍÇégópǵÇÊǧÇΔÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBDZÇÍÇ≈ÇÕê≥èÌÇ…ìÆçÏǵNjÇπÇÒÅBÉäÉNÉGÉXÉgÇ™É|ÉXÉgÇ≥ÇÍÇΩå„ÅAÇ¢Ç∏ÇÍÇ©ÇÃéûì_Ç≈ÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕåãâ Çë“ÇøénÇflÇ‹Ç∑ÅBÉäÉNÉGÉXÉgÇ™É|ÉXÉgÇ≥ÇÍÇΩÇÃÇΔìØÇ∂èÍèäÇ≈ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ë“ã@ÇçsǧèÍçáÅAÉäÉNÉGÉXÉgǪÇÃLJÇÃÇ™åãâ ÇΔǵǃåªÇÍÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAǪÇÍÇ™åãâ Ç≈džÇÈÇΔǢǧåÎÇ¡ÇΩîFéØÇ©ÇÁÉäÉNÉGÉXÉgÇÉNÉäÉAǵǃǵNjǧÇΩÇflÅANjǡÇΩÇ≠âΩÇÃèàóùLJé¿çsÇ≥ÇÍÇ‹ÇπÇÒÅBDZÇÍÇ™ÅAëoï˚å¸ÇÃÉfÅ[É^ÇÃÇ‚ÇËéÊÇËÇçsǧÇΩÇflÇ…
2 ǬÇÃNjǡÇΩÇ≠àŸÇ»ÇÈÉGÉìÉeÉBÉeÉBÇégópÇ∑ÇÈDZÇΔÇ™èdóvÇ≈džÇÈÇΔǢǧDZÇΔÇÃóùóRÇ≈Ç∑ÅB
É^ÉXÉNÇÃçÏê¨
É^ÉXÉNÇÃçÏê¨ÇÕÅAMPCreateTask ÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊǡǃé¿çsǵNjÇ∑ÅBDZÇÃåƒÇ—èoǵDžëŒÇ∑ÇÈç≈èâÇÃÉpÉâÉÅÅ[É^ÇÕÅAé¿çsÉ^ÉXÉNÇΔÇ»ÇÈä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈Ç∑ÅBÉ^ÉXÉNÇÃä÷êîÇÕÅAéüÇÃÇÊǧǻÉvÉçÉgÉ^ÉCÉvÇéùǬïKóvǙdžÇËÇ‹Ç∑ÅB
OSStatus fTask( void *parameter );
É^ÉXÉNÇÕÅAǪÇÃÉXÉ^Å[ÉgÉAÉbÉvéûÇ… 32 ÉrÉbÉgÉpÉâÉÅÅ[É^ÇéÛÇØéÊÇËÅAǪÇÃèIóπéûÇ…ÇÕ 32
ÉrÉbÉgÇÃåãâ Çï‘ǵNjÇ∑ÅBÉXÉ^Å[ÉgÉAÉbÉvéûÇ…É^ÉXÉNÇ™éÛÇØéÊÇÈÉpÉâÉÅÅ[É^ÇÕÅAMPCreateTask
åƒÇ—èoǵDžëŒÇ∑ÇÈëÊ 2 ÇÃÉpÉâÉÅÅ[É^ÇΔǵǃéwíËǵNjÇ∑ÅBDZÇÃÉpÉâÉÅÅ[É^ÇâÓǵǃÅAÉ^ÉXÉNÇ™ïKóvÇΔÇ∑ÇÈÇ∑Ç◊ǃÇÃèâä˙èÓïÒÇÃÇ‚ÇËéÊÇËÇ™çsÇÌÇÍÇ‹Ç∑ÅBDZÇÃíÜÇ…ÇÕÅAÉÅÉbÉZÅ[ÉWÉLÉÖÅ[ÇÃ
ID Ç‚ C++ ÉIÉuÉWÉFÉNÉgÇ÷ÇÃÉ|ÉCÉìÉ^ǻǫÅAdžÇÁljÇÈLJÇÃÇ™ä‹Ç‹ÇÍǃǢNjÇ∑ÅBDZÇÍÇ™ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™É^ÉXÉNÇÃéıñΩëSëÃÇ…ÇÌÇΩǡǃÇ≥NjǥNjǻèÓïÒÇÇ‚ÇËéÊÇËÇ∑ÇÈÉ^ÉXÉNå≈óLÇÃÉÅÉÇÉäÉuÉçÉbÉNÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈džÇÈDZÇΔLJãHÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅB
MPLibraryIsLoaded ÇÃåƒÇ—èoǵǩÇÁ MPCreateTask ÇÃåƒÇ—èoǵNjÇ≈ÅADZDZNjÇ≈ÇÃÇ∑Ç◊ǃÇÃèàóùÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉXÉ^Å[ÉgÉAÉbÉvéûÇ…é¿çsÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™é¿çsÇ≥ÇÍǃǢÇÈä‘ÅAÉ^ÉXÉNÇé¿çsǵë±ÇØÇÈDZÇΔÇÕÅAïKóvÇ…âûÇ∂ǃÉ^ÉXÉNÇçÏê¨ÇµÇƒîjâÛÇ∑ÇÈDZÇΔÇ…î‰Ç◊ÇÈÇΔÇÕÇÈǩDžå¯ó¶ÇÃÇÊÇ¢êÌó™ÇΔǢǶNjÇ∑ÅBÉ^ÉCÉvÇÃàŸÇ»ÇÈèàóùÇé¿çsÇ∑ÇÈÇ≥NjǥNjǻÉ^ÉXÉNÇëΩêîçÏê¨Ç∑ÇÈïKóvǙdžÇÈèÍçáÇÕÅAÉZÉåÉNÉ^ÉxÅ[ÉXÇÃÉXÉLÅ[É}ÅAÇ‹ÇΩÇÕâ¬ïœä÷êîÉ|ÉCÉìÉ^ÇâÓǵǃÅAÉ^ÉCÉvÇÃàŸÇ»ÇÈëΩêîÇÃä÷êîÇåƒÇ—èoÇ∑DZÇΔÇÃÇ≈Ç´ÇÈÉ^ÉXÉNÇÃçÏê¨Çåüì¢ÇµÇƒÇ≠ÇæÇ≥Ç¢ÅB
éüÇÃÉRÅ[ÉhÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìǙǪÇÃãNìÆíºå„Ç…É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOã@î\ÇämóßÇ∑ÇÈï˚ñ@ÇãÔëÃìIÇ…é¶ÇµÇƒÇ¢Ç‹Ç∑ÅBDZÇÃÉRÅ[ÉhÇ≈ÇÕÅAÉvÉçÉZÉbÉTêîÇÊÇËLJàÍǬè≠ǻǢÉ^ÉXÉNÇçÏê¨Ç∑ÇÈÉeÉNÉjÉbÉNÇégópǵǃǢNjÇ∑ÅB
|
typedef struct {
long firstThing;
long totalThings;
}sWorkParams, *sWorkParamsPtr;
typedef struct {
MPTaskID taskID;
MPQueueID requestQueue;
MPQueueID resultQueue;
sWorkParams params;
}sTaskData, *sTaskDataPtr;
long gNumProcessors;
sTaskDataPtr gTaskData;
MPQueueID gNotificationQueue;
void fStartMP( void ) {
OSErr theErr;
long i;
theErr = noErr;
/* ÉVÉìÉOÉãÉvÉçÉZÉbÉTÉÇÅ[ÉhÇëOíÒÇΔÇ∑ÇÈ */
gNumProcessors = 1;
/* écÇ≥ÇÍǃǢÇÈÉOÉçÅ[ÉoÉãÇèâä˙âªÇ∑ÇÈ */
gTaskData = NULL;
gNotificationQueue = NULL;
/* ÉâÉCÉuÉâÉäÇ™ë∂ç›Ç∑ÇÈèÍçáÇÕÅAÉ^ÉXÉNÇçÏê¨Ç∑ÇÈ */
/* (ÉVÉìÉOÉã CPU ÉVÉXÉeÉÄè„Ç…ÇÕÉ^ÉXÉNÇÕë∂ç›ÇµÇ»Ç¢) */
if( MPLibraryIsLoaded() ) {
gNumProcessors = MPProcessors();
gTaskData = (sTaskDataPtr)NewPtrClear( (gNumProcessors - 1) *
sizeof( sTaskData ) );
theErr = MemError();
if( theErr == noErr )
theErr = MPCreateQueue( &gNotificationQueue );
for( i = 0; i < gNumProcessors - 1 && theErr == noErr; i++ ) {
if( theErr == noErr )
theErr = MPCreateQueue( &gTaskData[i].requestQueue );
if( theErr == noErr )
theErr = MPCreateQueue( &gTaskData[i].resultQueue );
if( theErr == noErr )
theErr = MPCreateTask( fTask, &gTaskData[i],
kMPUseDefaultStackSize, gNotificationQueue,
NULL, NULL, kMPNormalTaskOptions,
&gTaskData[i].taskID );
}
}
/* âΩÇÁÇ©ÇÃïsãÔçáǙdžÇÈèÍçáÇÕÅAÉVÉìÉOÉãÉvÉçÉZÉbÉTÉÇÅ[ÉhÇ…ñflÇÈ */
if( theErr != noErr ) {
fStopMP();
gNumProcessors = 1;
}
}
 |
sWorkParams ç\ë¢ëÃÇÕÅAÉ^ÉXÉNÇ…ÇÊǡǃåƒÇ—èoÇ≥ÇÍÇÈä÷êîÇ…ìnÇ∑ÉpÉâÉÅÅ[É^ÇíËã`ǵNjÇ∑ÅBDZÇÃÉuÉçÉbÉNÇÃì‡óeÇÕÅAé¿çsÇ≥ÇÍÇÈèàóùÇÃÉ^ÉCÉvÇ…å≈óLÇÃLJÇÃÇ≈Ç∑ÅBǪÇÃíÜÇ≈LJÅADZÇÍÇÁÇÃÉpÉâÉÅÅ[É^ÇÕä÷êîÇ™èàóùÇ∑ÇÈDZÇΔDžǻǡǃǢÇÈì¡íËÇÃÉfÅ[É^ÇíËã`ǵNjÇ∑ÅB
sTaskData ç\ë¢ëÃÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™É^ÉXÉNÇΔÇÃä‘Ç≈Ç≥NjǥNjǻÉfÅ[É^ÇÇ‚ÇËéÊÇËÇ∑ÇÈÇΩÇflÇ…égópÇ∑ÇÈÉfÅ[É^ÇÃÉuÉçÉbÉNÇíËã`ǵNjÇ∑ÅBÇ‚ÇËéÊÇËÇ≥ÇÍÇÈ
2 ǬÇÃéÂÇ»ÉfÅ[É^ÇÕÅAÉLÉÖÅ[ ID ÇΔèàóùä÷êîÇÃÉpÉâÉÅÅ[É^Ç≈Ç∑ÅB
gNumProcessors ÉOÉçÅ[ÉoÉãÇ…ÇÕÅAÉVÉXÉeÉÄì‡Ç≈åüèoÇ≥ÇÍÇΩÉvÉçÉZÉbÉTêîÇÃÉJÉEÉìÉgÇ™äiî[Ç≥ÇÍÇ‹Ç∑ÅBÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API ÉâÉCÉuÉâÉäÇ™ÉçÅ[ÉhÇ≥ÇÍǃǢǻǢèÍçáÅAÇ‹ÇΩÇÕÅAÉ^ÉXÉNdžÇÈÇ¢ÇÕÉLÉÖÅ[ÇÃçÏê¨Ç™âΩÇÁÇ©ÇÃóùóRÇ≈é∏îsǵÇΩèÍçáÅADZÇÃïœêîÇÃílÇÕ
1 Ç…ê›íËÇ≥ÇÍÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÉRÅ[ÉhÇÃécÇËÇÃïîï™ÇÕÅAgNumProcessors
Ç™ 1 ÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìǪÇÃLJÇÃÇ™Ç∑Ç◊ǃÇÃèàóùÇé¿çsǵÅAâΩÇÁÇ©ÇÃÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API åƒÇ—èoǵÇé¿çsǵǻǢÇÊǧDžç\ê¨Ç≥ÇÍǃǢNjÇ∑ÅB
gTaskData ÉOÉçÅ[ÉoÉãÇÕÅAìÆìIÇ…äÑÇËìñǃÇÁÇÍÇΩîzóÒÇ≈džÇÈ sTaskData
ÉuÉçÉbÉNÇÉ|ÉCÉìÉgǵNjÇ∑ÅBçÏê¨Ç≥ÇÍÇÈǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ…ëŒÇµÇƒ 1 ǬÇÃÉGÉìÉgÉäÇ™ë∂ç›ÇµÇ‹Ç∑ÅB
gNotificationQueue ÉOÉçÅ[ÉoÉãÇÕÅAèIóπǵÇΩÉ^ÉXÉNÇ©ÇÁí ímÉÅÉbÉZÅ[ÉWÇéÛÇØéÊÇÈÇΩÇflÇ…égópÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃó·Ç≈ÇÕÅAÇ∑Ç◊ǃÇÃÉ^ÉXÉNÇ™àÍǬÇÃí ímÉLÉÖÅ[Çã§óLǵǃǢNjÇ∑ÅB
ÉvÉçÉZÉbÉTêîÇ©ÇÁ 1 Çà¯Ç¢ÇΩêîÇÃÉ^ÉXÉNÇ™çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBǪÇÍǺÇÍÇÃÉ^ÉXÉNÇÕÅAÉÅÉbÉZÅ[ÉWÉLÉÖÅ[ÇÃìΔé©ÇÃÉyÉAÇéùÇøÅAǪÇÍÇ…ÇÊǡǃÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉ^ÉXÉNÇΔÉfÅ[É^ÇÇ‚ÇËéÊÇËÇ≈Ç´Ç‹Ç∑ÅBÉLÉÖÅ[ÇÃ
ID ÇÕÅAÉ^ÉXÉNÇ≤ÇΔÇ… gTaskData ÉGÉìÉgÉäÇ…äiî[Ç≥ÇÍÇ‹Ç∑ÅBDZÇÃå„ÅAMPCreateTask
ÇégǡǃÉ^ÉXÉNÇ™çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBêÊì™ÇÃÉpÉâÉÅÅ[É^ÇÕÅAé¿çsÉ^ÉXÉNÇΔÇ»ÇÈä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈Ç∑ÅBDZÇÃó·Ç≈ÇÕÅAÇ∑Ç◊ǃÇÃÉ^ÉXÉNÇ™
fTask ÇΔǢǧìØÇ∂ä÷êîÇã§óLǵǃǢNjÇ∑ÅBdžÇÈä÷êîÇ™É}ÉãÉ`ÉvÉçÉZÉbÉTÇ…ÇÊǡǃìKêÿÇ…é¿çsÇ≥ÇÍÇÈèÍçáÅAǪÇÍÇÕ
"ÉäÉGÉìÉgÉâÉìÉg" ÇΔåƒÇŒÇÍÇ‹Ç∑ÅBǻǮÅA"äÑÇËçûÇ›ÉZÅ[Ét" ÇΔǢǧDZÇΔÇÕïKÇ∏ǵLJ
"ÉäÉGÉìÉgÉâÉìÉg" Çà√é¶ÇµÇ‹ÇπÇÒÅBäÑÇËçûÇ›ÇÕÅAàÍî Ç…ÅAMac ä¬ã´Ç≈ÇÕäÑÇËçûÇ›â¬î\Ç≈ÇÕÇ»Ç≠ÅAÉGÉìÉWÉjÉAÇÕÇΔǴǫǴDZÇÃDZÇΔÇóòópǵNjÇ∑ÅBǵǩǵÅAMP
ä¬ã´Ç≈ÇÕÅAÉ^ÉXÉNÉRÅ[Éhì‡ÇÃîCà”ÇÃèÍèäÇ≈îCà”ÇÃÉ^ÉCÉ~ÉìÉOÇ≈ìØéûÇ…é¿çsÇ≥ÇÍÇÈï°êîÇÃÉ^ÉXÉNÇ™ë∂ç›ÇµÇ§ÇÈDZÇΔÇå©âzǵǃǮÇ≠ïKóvǙdžÇËÇ‹Ç∑ÅB
ëÊ 2 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇà gTaskData ÉGÉìÉgÉäÇ÷ÇÃÉ|ÉCÉìÉ^Ç≈Ç∑ÅBÉ^ÉXÉNÇÕÅADZÇÃÉuÉçÉbÉNÇ©ÇÁÉäÉNÉGÉXÉgÇ®ÇÊÇ—åãâ ÉLÉÖÅ[ÇÃ
ID ÇíäèoÇ≈Ç´ÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBÉ^ÉXÉNìñÇΩÇË 2 ǬÇÃÉLÉÖÅ[Ç™ïKóvÇ≈ǻǢDZÇΔLJdžÇËÇ‹Ç∑ÅBÇΩǢǃǢÇÃèÍçáÅA2
ǬÇÃÉLÉÖÅ[ÇÃçáåvílÇégópÇ∑ÇÈDZÇΔÇ™â¬î\Ç≈Ç∑ÅBÇ∑Ç◊ǃÇÃÉäÉNÉGÉXÉgÇÕàÍǬÇÃÉLÉÖÅ[Ç…É|ÉXÉgÇ≥ÇÍÅAÇ∑Ç◊ǃÇÃåãâ ÇÕï ÇÃÉLÉÖÅ[Ç…ï‘Ç≥ÇÍÇ‹Ç∑ÅBÇ«ÇÃÉ^ÉXÉNǙǫÇÃÉäÉNÉGÉXÉgÇèàóùÇ∑ÇÈǩǙñ‚ëËÇ…Ç»ÇÁǻǢÇΔÇ´ÇÕÅADZÇÃÇÊǧDžìÆçÏǵNjÇ∑ÅBÇΩÇæÇµÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ…ëŒÇ∑ÇÈÉpÉâÉÅÅ[É^ÇÕÅAÉÅÉbÉZÅ[ÉWì‡Ç…äÆëSÇ…ä‹Ç‹ÇÍǃǢÇÈÇ©ÅAç≈èâÇÃÉäÉNÉGÉXÉgÇÉTÉuÉ~ÉbÉgÇ∑ÇÈëOÇ…Ç∑Ç◊ǃÇÃÉ^ÉXÉNÇ…ëŒÇµÇƒÇ†ÇÁÇ©Ç∂ÇflämóßÇ≥ÇÍǃǢÇÈïKóvǙdžÇËÇ‹Ç∑ÅB
ëÊ 3 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇ…égópÇ∑ÇÈñ⁄ìIÇÃÉXÉ^ÉbÉNÉTÉCÉYÇ≈Ç∑ÅBǪÇÍǺÇÍÇÃÉ^ÉXÉNÇÕìΔé©ÇÃÉXÉ^ÉbÉNÇéùÇøÇ‹Ç∑ÅBëΩêîÇÃÉ^ÉXÉNÇçÏê¨ÇµÇÊǧÇΔǵǃǢÇÈèÍçáÇÕÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ™éÛÇØéÊÇÈDZÇΔÇ…Ç»ÇÈÉXÉ^ÉbÉNÇÃÉTÉCÉYÇ…êßå¿Çâ¡Ç¶ÇÈDZÇΔÇåüì¢ÇµÇƒÇ≠ÇæÇ≥Ç¢ÅBÉfÉtÉHÉãÉgÇÃÉTÉCÉYÇÕ
64K Ç≈džÇËÅADZÇÃílÇǪÇÃNjNjégópÇ∑ÇÈÇΔÅAîÒèÌÇ…ëΩÇ≠ÇÃÉ^ÉXÉNÇçÏê¨ÇµÇÊǧÇΔǵǃǢÇÈèÍçáÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API ÉâÉCÉuÉâÉäÇ™égópÇ≈Ç´ÇÈÉÅÉÇÉäóeó ÇǩǻÇËà≥îóǵǃǵNjǧèÍçáǙdžÇËÇ‹Ç∑ÅBÉXÉ^ÉbÉNÉTÉCÉYÇéwíËÇ∑ÇÈÇΔÇ´ÇÕÅAÉ^ÉXÉNÇÃç≈LJê[Ç¢åƒÇ—èoǵÉ`ÉFÅ[ÉìÇ™ïKóvÇΔÇ∑ÇÈç≈è¨å¿ÇÃÉXÉyÅ[ÉXÇäÑÇËìñǃÇÈÇÊǧDžíçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅB
ëÊ 4 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAè»ó™â¬î\Ç»í ímÉLÉÖÅ[Ç…ëŒÇ∑ÇÈLJÇÃÇ≈Ç∑ÅBDZÇÃÉLÉÖÅ[ÇÕÅAÉ^ÉXÉNÇÃèIóπÉVÅ[ÉPÉìÉXÇ≈ÇÕîÒèÌÇ…èdóvÇ…Ç»ÇËÇ‹Ç∑ÅBÉ^ÉXÉNǪÇÃLJÇÃÇégǡǃÉ^ÉXÉNÇÃèIóπÇåµñßÇ…ÉRÅ[ÉfÉBÉlÅ[ÉgǵǻǢèÍçáÅADZÇÃÉpÉâÉÅÅ[É^ÇÕéñé¿è„è»ó™â¬î\Ç≈ÇÕdžÇËÇ‹ÇπÇÒÅBåxçêǻǵDžÉ^ÉXÉNÇèIóπÇ∑ÇÈèÍçáÇÕÅAí ímÉLÉÖÅ[ÇÕê‚ëŒÇ…ïKóvÇ…Ç»ÇËÇ‹Ç∑ÅBǪÇÃóùóRDžǬǢǃÇÕå„èqǵNjÇ∑ÅB
ëÊ 5 Ç®ÇÊÇ— ëÊ 6 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇ™èIóπÇ∑ÇÈÇΔÇ´Ç…í ímÉLÉÖÅ[Ç…ï‘Ç≥ÇÍÇ‹Ç∑ÅB
ëÊ 7 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNçÏê¨ÇÃê´éøÇïœçXÇ∑ÇÈÇΩÇflÇ…égópǵNjÇ∑ÅBåªç›ÇÃÇΔDZÇÎÅAégópâ¬î\Ç»ÉIÉvÉVÉáÉìÇÕdžÇËÇ‹ÇπÇÒÅB
ëÊ 8 ÇÃÉpÉâÉÅÅ[É^ÇÕÅAMPCreateTask Ç…ÇÊǡǃñÑÇflÇÁÇÍÇ‹Ç∑ÅBDZÇÃÉpÉâÉÅÅ[É^ÇÕÅAêVǵÇ≠çÏê¨Ç≥ÇÍÇΩÉ^ÉXÉNÇÃ
ID ÇΔÇ»ÇËÇ‹Ç∑ÅBï÷ãXè„ÅADZÇÃÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇà gTaskData ÉGÉìÉgÉäÇ…äiî[Ç≥ÇÍÇ‹Ç∑ÅBÇΩÇæÇµÅAÉ^ÉXÉNǙǪÇÍÇÁÇÃ
ID ÇímÇÈïKóvÇÕÇŸÇΔÇÒǫdžÇËÇ‹ÇπÇÒÅB
É^ÉXÉNÇÃçÏê¨íÜÇ…âΩÇÁÇ©ÇÃñ‚ëËÇ™î≠ê∂Ç∑ÇÈÇΔÅAfStopMP Ç™åƒÇ—èoÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃåƒÇ—èoǵDžÇÊÇËÅAǪÇÍÇ‹Ç≈Ç…çÏê¨Ç≥ÇÍÇΩÇ∑Ç◊ǃÇÃLJÇÃÇ™çÌèúÇ≥ÇÍǃèIóπǵNjÇ∑ÅBÇ≥ÇÁÇ…ÅAgNumProcessors
ïœêîÇÃílÇ™ 1 Ç…ê›íËÇ≥ÇÍÇ‹Ç∑ÅBǪÇÃåãâ ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕégópâ¬î\Ç»ÉvÉçÉZÉbÉTÇ™àÍǬǵǩǻǢǩÇÃÇÊǧDžèàóùÇåpë±ÇµÇ‹Ç∑ÅBfStopMP
ä÷êîÇÃè⁄ç◊DžǬǢǃÇÕå„èqǵNjÇ∑ÅB
éüÇ…ÅAÉTÉìÉvÉãÉ^ÉXÉNÇé¶ÇµÇ‹Ç∑ÅBDZÇÃÉ^ÉXÉNÇ™ç≈èâÇ…é¿çsÇ∑ÇÈDZÇΔÇÕÅAMPCreateTask Ç≈éwíËÇ≥ÇÍǃǢÇÈ
gTaskData ÉGÉìÉgÉäÇ÷ÇÃÉ|ÉCÉìÉ^ÇämóßÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBÉ^ÉXÉNÇÕÅADZÇÃÉuÉçÉbÉNÇ©ÇÁÉäÉNÉGÉXÉgÇ®ÇÊÇ—åãâ ÉLÉÖÅ[ÇéÊìæÇµÇ‹Ç∑ÅBǪÇÃå„ÅAÉ^ÉXÉNÇÕÉäÉNÉGÉXÉgÉLÉÖÅ[è„Ç≈ÉäÉNÉGÉXÉgÇë“ÇøÇ‹Ç∑ÅBÉ^ÉXÉNÇÕÅAéÛÇØéÊÇ¡ÇΩÉÅÉbÉZÅ[ÉWÇégǡǃÅAåƒÇ—èoÇ∑ä÷êîÇëIëǵNjÇ∑ÅBä÷êîÇ…égópÇ∑ÇÈÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇÃ
gTaskData ÉGÉìÉgÉäÇ©ÇÁíäèoÇ≥ÇÍÇ‹Ç∑ÅBDZÇÃÉGÉìÉgÉäÇÕÅAÉäÉNÉGÉXÉgÉÅÉbÉZÅ[ÉWÇÉ|ÉXÉgÇ∑ÇÈëOÇ…ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃÉZÉbÉgÉAÉbÉvÇ≥ÇÍǃǢNjÇ∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉ^ÉXÉNǙǪÇÃåãâ ÉÅÉbÉZÅ[ÉWÇëóêMÇ∑ÇÈÇ‹Ç≈ÅAÉ^ÉXÉNÇ…ìnÇ∑Ç∑Ç◊ǃÇÃÉpÉâÉÅÅ[É^ÇÃóLå¯ê´Çà€éùÇ∑ÇÈÇΩÇflÇ…ç◊êSÇÃíçà”Çï•ǧïKóvǙdžÇËÇ‹Ç∑ÅBÇΩÇΔǶnjÅAåªç›é¿çsÇ≥ÇÍǃǢÇÈÉ^ÉXÉNÇ…ÇÊǡǃèëÇ´çûÇ‹ÇÍÇΩÉÅÉÇÉäÇà⁄ìÆÇµÇΩÇËçÌèúǵÇΩÇËÇ∑ÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕîjã«ìIÇ»éñë‘Ç…ä◊ǡǃǵNjǢNjÇ∑ÅB
|
#define kMyRequestOne 1
#define kMyRequestTwo 2
#define kMyResultException -1
OSStatus fTask( void *parameter ) {
OSErr theErr;
sTaskDataPtr p;
Boolean finished;
long message;
theErr = noErr;
/* DZÇÃÉ^ÉXÉNÇÃÉÜÉjÅ[ÉNÇ»ÉfÅ[É^Ç÷ÇÃÉ|ÉCÉìÉ^ÇéÊìæÇ∑ÇÈ */
p = (sTaskDataPtr)parameter ;
/* É^ÉXÉNÇ…ìnǵÇΩäeÉäÉNÉGÉXÉgÇèàóùǵÅAåãâ Çï‘Ç∑ */
finished = false;
while( !finished ) {
theErr = MPWaitOnQueue( p->requestQueue, (void **)&message,
NULL, NULL, kDurationForever );
if( theErr == noErr ) {
/* åƒÇ—èoÇ∑ä÷êîÇëIëǵÅAÉpÉâÉÅÅ[É^ÇìnÇ∑ */
/* ÉpÉâÉÅÅ[É^ÇÕÅAÉ^ÉXÉNÇ™éÛÇØéÊÇ¡ÇΩÉÅÉbÉZÅ[ÉWÇëóêMÇ∑ÇÈëOÇ… */
/* Ç∑Ç≈Ç…ÉZÉbÉgÉAÉbÉvÇ≥ÇÍǃǢÇÈÅBÉZÉåÉNÉ^ÇégópÇ∑ÇÈë„ÇÌÇËÇ…ÅA */
/* ñ⁄ìIÇÃä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^ÇìnÇ∑DZÇΔLJÇ≈Ç´ÇÈ */
switch( message ) {
case kMyRequestOne:
theErr = fMyTaskFunctionOne( &p->params );
break;
case kMyRequestTwo:
theErr = fMyTaskFunctionTwo( &p->params );
break;
default:
finished = true;
theErr = kMyResultException;
}
MPNotifyQueue( p->resultQueue, (void *)theErr, NULL, NULL );
}
else
finished = true;
}
/* É^ÉXÉNÇÕDZÇÍÇ≈èIóπ */
return( theErr );
}
 |
É^ÉXÉNÇégÇ¡ÇΩèàóùÇÃé¿çs
Ç¢Ç≠ǬǩÇÃèàóùÇÃé¿çsÇïKóvÇΔÇ∑ÇÈÇΔÇ´ÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉ^ÉXÉNÇ…ïKóvǻLJÇÃÇ™Ç∑Ç◊ǃÉÅÉÇÉäì‡Ç…ë∂ç›Ç∑ÇÈDZÇΔÇämîFǵNjÇ∑ÅBǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ…ëŒÇµÇƒÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÅAÉ^ÉXÉNÇ…é¿çsÇ≥ÇπÇΩÇ¢èàóùÇÃÉpÉâÉÅÅ[É^ÇämóßǵÅAÇ≥ÇÁÇ…
Queue Ç‹ÇΩÇÕ Semaphore ÇÃÇ¢Ç∏ÇÍÇ©ÇâÓǵǃÅAǪÇÃèàóùÇé¿çsÇ∑ÇÈÉ^ÉXÉNÇ…ÉVÉOÉiÉãÇëóÇËÇ‹Ç∑ÅBÉ^ÉXÉNÇ™é¿çsÇ∑ÇÈì¡íËÇÃèàóùÇÕÅAÉÅÉbÉZÅ[ÉWÇÃì‡ïîÇ≈äÆëSÇ…íËã`Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÇ‹ÇΩÅAëOèqǵÇΩÇÊǧDžÅAǪÇÃÉ^ÉXÉNÇÃÇΩÇflÇ…ó\ñÒÇ≥ÇÍǃǢÇÈÉÅÉÇÉäÉuÉçÉbÉNÇÃíÜÇ≈íËã`Ç∑ÇÈDZÇΔLJâ¬î\Ç≈Ç∑ÅBÇ¢Ç∏ÇÍÇÃï˚ñ@LJàÍî ìIÇ…égópÇ≥ÇÍÇ‹Ç∑ÅBàÍïîÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAèàóùÇé¿çsÇ∑ÇÈÇΩÇflÇ…É^ÉXÉNÇ™åƒÇ—èoÇ∑ä÷êîÇ÷ÇÃÉ|ÉCÉìÉ^ÇìnÇ∑DZÇΔLJdžÇËÇ‹Ç∑ÅBDZÇÃï˚ñ@Ç…ÇÊÇËÅAàÍǬÇÃÉ^ÉXÉNÇ™ëΩêîÇÃÉ^ÉCÉvÇ™àŸÇ»ÇÈèàóùÇé¿çsÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
É^ÉXÉNÇ©ÇÁÉVÉOÉiÉãÇ™èoÇ≥ÇÍÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕèàóùÇéËì`ǧDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅBÇ‹ÇΩÅAé©ï™ÇÃÉCÉxÉìÉgÉãÅ[ÉvÇ…ñflÇËÅAǪÇÃéûì_Ç≈
kDurationImmediate ë“ã@ÇégǡǃǢÇÈÉ^ÉXÉNÇÉ`ÉFÉbÉNÇ∑ÇÈèÍçáLJdžÇËÇ‹Ç∑ÅB
kDurationImmediate Ç™ MPWaitOnQueue ÅAMPWaitOnSemaphore ÅAÇ‹ÇΩÇÕ
MPEnterCriticalRegion Ç…éwíËÇ≥ÇÍǃǢÇÈÇΔÇ´ÅAä÷êîÇÕë¶ç¿Ç…ílÇï‘ǵNjÇ∑ÅBñflÇËílÇ™
kMPTimeoutErr ÇÃèÍçáÅAë“ÇΩÇÍǃǢÇΩLJÇÃÇÕâΩLJéÊìæÇ≈Ç´Ç‹ÇπÇÒÅBǬNjÇËÅAÉÅÉbÉZÅ[ÉWÇÕégópÇ≈Ç´Ç∏ÅASemaphore
ÇÕÉ[ÉçÇ≈ÅACritical Region ÇÕï ÇÃÉvÉçÉZÉbÉTÇ…ÇÊǡǃé¿çsÇ≥ÇÍÇΩÇΔǢǧDZÇΔÇ≈Ç∑ÅB
DZÇÃÇΩÇflÅAÉAÉvÉäÉPÅ[ÉVÉáÉìǙǪÇÃÉCÉxÉìÉgÉãÅ[ÉvÇÃíÜÇ≈É^ÉXÉNÇÃåãâ ÇÉ`ÉFÉbÉNǵǃǢÇÈèÍçáÅAkDurationImmediate
ë“ã@ÇégǡǃÅAñflÇËílÇÉ`ÉFÉbÉNǵNjÇ∑ÅBñflÇËílÇ™ noErr ÇÃèÍçáÅAåãâ ÇÕë∂ç›ÇµÅAåƒÇ—èoǵDžÇÊǡǃéÊìæÇ≥ÇÍNjǵÇΩÅBàÍï˚ÅAñflÇËílÇ™
kMPTimeoutErr ÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ç≈å„Ç…É`ÉFÉbÉNÇçsÇ¡ÇΩå„Ç≈ÅAÉ^ÉXÉNÇÕêVǵǢåãâ ÇâΩLJê∂ê¨ÇµÇ‹ÇπÇÒÇ≈ǵÇΩÅBÇ‡ÇøÇÎÇÒÅADZÇÍà»äOÇÃéÌófiÇÃÉGÉâÅ[Ç™ï‘Ç≥ÇÍÇÈDZÇΔLJdžÇËÇ‹Ç∑ÅB
ëOèqǵÇΩÇÊǧDžÅAÉäÉNÉGÉXÉgÇÃèàóùÇèIóπÇ∑ÇÈÇΔÇ´ÅAÉ^ÉXÉNÇÕåãâ ÇÉ|ÉXÉgǵǃÅAèàóùÇ™é¿çsÇ≥ÇÍÇΩDZÇΔÇÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ímÇÁÇπÇ‹Ç∑ÅB
éüÇ…ÅAÉ^ÉXÉNÇégópǵǃèàóùÇé¿çsÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃéñó·Çé¶ÇµÇ‹Ç∑ÅBDZÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìLJèàóùÇÃàÍïîÇé¿çsǵNjÇ∑ÅBǻǮÅADZÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAÉCÉxÉìÉgÇÕèàóùÇ≥ÇÍÇ‹ÇπÇÒÅBǬNjÇËÅAfMyTaskFunctionOne
Ç™èàóùÇé¿çsÇ∑ÇÈÇΩÇflÇ… 1/10 ïbà»è„ÇÃéûä‘ÇÇΔÇÁǻǢDZÇΔÇ™ëOíÒDžǻǡǃǢNjÇ∑ÅB
|
OSErr fDoMP( long realFirstThing, long realTotalThings ) {
long i;
OSErr theErr;
long thingsPerTask;
long message;
sWorkParams appData;
theErr = noErr;
thingsPerTask = realTotalThings / gNumProcessors;
/* ÉfÅ[É^ëSëÃÇç\ê¨Ç∑ÇÈÉÜÉjÅ[ÉNÇ»ïîï™ÇëŒè€Ç…
ǪÇÍǺÇÍÇÃÉ^ÉXÉNÇÃèàóùÇäJénÇ∑ÇÈ */
for( i = 0; i < gNumProcessors - 1; i++ ) {
gTaskData[i].params.firstThing = realFirstThing + thingsPerTask * i;
gTaskData[i].params.totalThings = thingsPerTask;
message = kMyRequestOne;
MPNotifyQueue( gTaskData[i].requestQueue, (void *)message,
NULL, NULL );
}
/* ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…écÇ¡ÇΩèàóùÇé¿çsÇ≥ÇπÇÈÅBgNumProcessors Ç™ */
/* 1 ÇÃèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™Ç∑Ç◊ǃÇÃèàóùÇé¿çsÇ∑ÇÈDZÇΔÇ…Ç»ÇËÅA */
/* É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO API ÉâÉCÉuÉâÉäÇÕåƒÇ—èoÇ≥ÇÍǻǢ */
appData.firstThing = realFirstThing + thingsPerTask * i;
appData.totalThings = realTotalThings - thingsPerTask * i;
fMyTaskFunctionOne( &appData );
/* É^ÉXÉNÇ™èIóπÇ∑ÇÈÇ‹Ç≈ë“ã@Ç∑ÇÈ */
for( i = 0; i < gNumProcessors - 1; i++ )
MPWaitOnQueue( gTaskData[i].resultQueue, (void **)&message,
NULL, NULL, kDurationForever );
return( theErr );
}
 |
DZÇÃÇÊǧǻÉAÉvÉçÅ[É`ÇÕëΩêîÇÃåªé¿ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈égópÇ≥ÇÍǃǢNjÇ∑ÅBì¡Ç…ÅAãêëÂÇ»ÉfÅ[É^ÉuÉçÉbÉNÇïœå`Ç∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ç≈ìKÇ≈Ç∑ÅBÉfÅ[É^ÇÕÉ^ÉXÉNÇ≈égópÇ∑ÇÈÇΩÇflÇ…ÉTÉCÉYÇÃìôǵǢïîï™Ç…ï™äÑÇ≥ÇÍÅAÉ^ÉXÉNÇ™äJénÇ≥ÇÍÇ‹Ç∑ÅBÇ≥ÇÁÇ…ÅAécÇ≥ÇÍÇΩÉTÉCÉYÇ™ìôǵÇ≠ǻǢïîï™ÇÕÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇÊǡǃèàóùÇ≥ÇÍÇ‹Ç∑ÅBécÇ≥ÇÍÇΩïîï™ÇÃèàóùÇ™èIóπÇ∑ÇÈÇΔÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕÉ^ÉXÉNÇ™èIóπÇ∑ÇÈÇÃÇë“ÇøÇ‹Ç∑ÅBǻǮÅAÉfÅ[É^Ç™ÉvÉçÉZÉbÉTÇÃêîÇ≈äÑÇËêÿÇÍÇÈÇΔÇÕñ≥èåèÇ…ëzíËǵǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBDZÇÃåÎÇËÇÕåoå±ñLǩǻÉGÉìÉWÉjÉAÇ≈Ç≥ǶîΔÇ∑èÍçáǙdžÇËÇ‹Ç∑ÅB
ï°êîÇÃÉtÉ@ÉCÉãÇìØéûÇ…ÉRÉìÉpÉCÉãǵÇÊǧÇΔÇ∑ÇÈäJî≠ä¬ã´Ç»Ç«ÅAÉTÉCÉYÇ™ìôǵÇ≠ǻǢÉTÉCÉYÇÃëÂÇ´Ç»ïîï™ÇèàóùÇ∑ÇÈÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÅAàŸÇ»ÇÈÉAÉvÉçÅ[É`Ç™ïKóvÇ…Ç»ÇËÇ‹Ç∑ÅBDZÇÃÇÊǧǻÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈ÇÕÉCÉxÉìÉgÉãÅ[ÉvÇégópǵÅAǪÇÍǺÇÍÇÃÉ^ÉXÉNÇ™äÑÇËìñǃÇÁÇÍÇΩèàóùÇèIóπÇ∑ÇÈÇΔÇ´ÅAïKóvÇ…âûÇ∂ǃÅAêVǵǢèàóùÇÉ^ÉXÉNÇ…äÑÇËìñǃÇÈÇÊǧDžǵNjÇ∑ÅB
É^ÉXÉNÇÃèIóπ
ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™èIóπÇ∑ÇÈÇΔÇ´ÅAMPTerminateTask ÇåƒÇ—èoǵNjÇ∑ÅBÇΩÇæÇµÅAMPTerminateTask
ÇÕé¿çsíÜÇÃÉ^ÉXÉNÇë¶ç¿Ç…çÌèúÇ∑ÇÈÇÌÇØÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBǪÇÍÇ™è´óàÇÃìKêÿÇ»éûä˙Ç…çÌèúÇ≥ÇÍÇÈÇΔǢǧÉtÉâÉOÇê›íËÇ∑ÇÈÇæÇØÇ≈Ç∑ÅBDZÇÃÇΩÇflÅAÉ^ÉXÉNÇ™é¿ç€Ç…èIóπÇ∑ÇÈÇ‹Ç≈ÅAÉ^ÉXÉNÇ™égópǵǃǢÇÈÉäÉ\Å[ÉXÇçÌèúǵǻǢDZÇΔÇ™îÒèÌÇ…èdóvÇ≈Ç∑ÅBDZÇÃDZÇΔÇämé¿Ç…çsǧDžÇÕÅAMPCreateTask
åƒÇ—èoǵÇÃÇΩÇflÇ…ópà”Ç≥ÇÍÇΩí ímÉLÉÖÅ[Çë“ǡǃÇ≠ÇæÇ≥Ç¢ÅBMPTerminateTask
ÇåƒÇ—èoÇ∑ÇΩÇ—Ç…ÅAÉÅÉbÉZÅ[ÉWÇΔǵǃÇÃí ímÉLÉÖÅ[Çë¶ç¿Ç…ë“ǬÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅBí ímÉLÉÖÅ[ÇéÛÇØéÊÇÍÇŒÅAÉ^ÉXÉNǙLJÇÕÇ‚é¿çsÇ≥ÇÍǃǢǻǢDZÇΔÇämîFÇ≈Ç´ÅAÇ≥ÇÁÇ…ã§óLÉäÉ\Å[ÉXÇçÌèúǵǃLJà¿ëSÇ≈džÇÈDZÇΔÇ™ÇÌÇ©ÇËÇ‹Ç∑ÅB
éüÇà fStopMP ä÷êîÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™èIóπǵÇÊǧÇΔÇ∑ÇÈÇΔÇ´Ç…é¿çsÇ≥ÇÍÇÈLJÇÃÇÃéñó·Ç≈Ç∑ÅBfStopMP
Ç…ä÷ǵǃíçà”Ç∑Ç◊Ç´èdóvÉ|ÉCÉìÉgÇÃàÍǬÇÕÅAMPTerminateTask ÇégǡǃÉ^ÉXÉNÇ™èIóπÇ≥ÇÍÇΩÇÁÇ∑ÇÆÇ…ÅAí ímÉLÉÖÅ[Ç…ÉÅÉbÉZÅ[ÉWÇ™ìûíÖÇ∑ÇÈÇ‹Ç≈ä÷êîÇÃé¿çsÇàÍéûí‚é~Ç∑ÇÈDZÇΔÇ≈Ç∑ÅB
|
void fStopMP( void ) {
long i;
if( gTaskData != NULL ) {
for( i = 0; i < gNumProcessors - 1; i++ ) {
if( gTaskData[i].taskID != NULL ) {
MPTerminateTask( gTaskData[i].taskID, noErr );
MPWaitOnQueue( gNotificationQueue, NULL,
NULL, NULL, kDurationForever );
}
if( gTaskData[i].requestQueue != NULL )
MPDeleteQueue( gTaskData[i].requestQueue );
if( gTaskData[i].resultQueue != NULL )
MPDeleteQueue( gTaskData[i].resultQueue );
}
if( gNotificationQueue != NULL ) {
MPDeleteQueue( gNotificationQueue );
gNotificationQueue = NULL;
}
DisposePtr( (Ptr)gTaskData );
gTaskData = NULL;
}
}
 |
É}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇ≈ǂǡǃǢǢDZÇΔÇΔÅAǂǡǃÇÕÇ¢ÇØÇ»Ç¢Ç±ÇΔ
ǂǡǃǢǢDZÇΔ
ÉXÉ^Å[ÉgÉAÉbÉvéûÇ…ÅAÉÅÉÇÉäïsë´ÇÃÇΩÇflÇ… MPLibrary ÇÉçÅ[ÉhÇ∑ÇÈDZÇΔÇ™Ç≈ǴǻǢÇΔǢǧÉÅÉbÉZÅ[ÉWÇ™ï\é¶Ç≥ÇÍÇΩèÍçáÇÕÅAResEdit
Ç‹ÇΩÇÕ Resourcer ÇégǡǃÅAÅgã@î\ägí£ÅhÉtÉHÉãÉ_DždžÇÈ Metronub ÇÃÉRÉsÅ[ÇäJǢǃÇ≠ÇæÇ≥Ç¢ÅB'sysz'
ÉäÉ\Å[ÉXÇÃílÇ 2500000 Ç…ïœçXǵNjÇ∑ÅBǪÇÍÇ≈LJñ‚ëËÇ™â¸ëPÇ≥ÇÍǻǢèÍçáÇÕÅA'sysz'
ÇÃílÇàÍìxÇ… 1MB Ç∏Ǭëùâ¡Ç≥ÇπǃÅAñ‚ëËÇâåàǵǃÇ≠ÇæÇ≥Ç¢ÅB
É^ÉXÉNÇÕÉtÉFÉCÉXÉåÉXèàóùÇé¿çsÇ∑ÇÈä÷êîÇåƒÇ—èoǵNjÇ∑ÅBåvéZíÜêSÇÃÉRÅ[ÉhÇÕÅAMP É^ÉXÉNÇÃégópÇåüì¢Ç∑Ç◊Ç´óBàÍÇÃÉ^ÉCÉvÇÃÉRÅ[ÉhÇ≈Ç∑ÅBDZÇÃÉãÅ[ÉãÇÕÅAMac
OS 8 Ç≈ÇÕǩǻÇËä…òaÇ≥ÇÍNjǵÇΩÇ™ÅAåvéZíÜêSÇÃÉRÅ[ÉhÇ… MP ÇégópÇ∑ÇÈDZÇΔÇ≈ÅAÉXÉãÅ[ÉvÉbÉgÇ™îÚñÙìIÇ…å¸è„Ç∑ÇÈÇÃLJéñé¿Ç≈Ç∑ÅBMac
OS 8 Ç≈ÇÕÅAï ÇÃÉ^ÉCÉvÇÃÉRÅ[ÉhÇÉ}ÉãÉ`É^ÉXÉNâªÇ∑ÇÈDZÇΔÇ≈âûìöê´Ç™Ç©Ç»ÇËâ¸ëPÇ≥ÇÍǃǢNjÇ∑ÅB
ÉäÉNÉGÉXÉgÇ®ÇÊÇ—åãâ ÉVÉOÉiÉãÇÃä‘Ç…É^ÉXÉNÇ…ÇÊǡǃé¿çsÇ≥ÇÍÇÈèàóùÇÕ "é¿éøìI"
ǻLJÇÃÇ≈Ç∑ÅBìØä˙ÉÅÉ\ÉbÉhÇÃÇ¢Ç∏ÇÍÇ©åoóRÇ≈ÉVÉOÉiÉãÇÃëóêMÇ‹ÇΩÇÕéÛêMÇçsǧDžÇÕÅAêîïSÉ}ÉVÉìÉTÉCÉNÉãÇóvǵNjÇ∑ÅBÉ^ÉXÉNÇ™ÉäÉNÉGÉXÉgÇ≥ÇÍÇΩèàóùÇäÆóπÇ∑ÇÈÇ‹Ç≈Ç…êîÉTÉCÉNÉãǵǩǩǩÇÁǻǢèÍçáÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉpÉtÉHÅ[É}ÉìÉXÇÕÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÇégǧDZÇΔÇ≈åÄìIÇ…í·â∫ǵNjÇ∑ÅBÉ^ÉXÉNÇÕÅAàÍǬÇÃÉäÉNÉGÉXÉgìñÇΩÇËè≠Ç»Ç≠ÇΔLJïSñúÉTÉCÉNÉãÇè¡îÔÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB200MHz
ÇÃÉvÉçÉZÉbÉTÇ≈ÇÕÅADZÇÍÇÕ 5 É~ÉäïbÇ…ëäìñǵÅADZÇÃï∂èëëSëÃÇ≈à¯ópÇ≥ÇÍǃǢÇÈ 1/10 ïbÇÃâûìöéûä‘Ç…î‰Ç◊ÇÈÇΔ
20 î{ë¨Ç¢Ç±ÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
É^ÉXÉNÇ™ÉÅÉÇÉäÇÃäÑÇËìñǃÇïKóvÇΔǵǃǢÇÈèÍçáÇÕÅAÉ^ÉXÉNÇ™ÉVÉOÉiÉãÇèoÇ∑ëOÇ…ÉÅÉÇÉäÇäÑÇËìñǃÇÈÇ©ÅAMPAllocate
ä÷êîÇégópÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBMPAllocate ä÷êîÇÕÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉÅÉÇÉäÇ©ÇÁäÑÇËìñǃÇÁÇÍÇΩÉÅÉÇÉäÉuÉçÉbÉNÇï‘ǵNjÇ∑ÅBǵǩǵécîOǻDZÇΔÇ…ÅAMPAllocate
ÇÃèàóùë¨ìxÇÕîÒèÌÇ…í·ë¨Ç≈Ç∑ÅBMPAllocate Çé¿çsÇ∑ÇÈÇΔÉ^ÉXÉNÇ™íÜífÇ≥ÇÍǃǵNjǢÅAÉAÉvÉäÉPÅ[ÉVÉáÉìÇ™ÉäÉNÉGÉXÉgÇñûë´Ç∑ÇÈDZÇΔÇóvãÅǵÅAǪÇÃå„Ç≈É^ÉXÉNÇÉåÉWÉÖÅ[ÉÄǵNjÇ∑ÅBMPAllocate
ÇëΩópÇ∑ÇÈÇΔÅAÉ^ÉXÉNÇÃÉXÉãÅ[ÉvÉbÉgÇ™îÒèÌÇ…í·â∫ǵNjÇ∑ÅBÉÅÉÇÉäÇämï€Ç∑ÇÈÇΩÇflÇÃç≈ëPÇÃÉ\ÉäÉÖÅ[ÉVÉáÉìÇÕÅAdžÇÁÇ©Ç∂ÇflÇ≈Ç´ÇÈÇæÇØëΩÇ≠ÇÃÉÅÉÇÉäÇäÑÇËìñǃǃǵNjǧDZÇΔÇ≈Ç∑ÅBDZÇÍÇ™ïsâ¬î\Ç»èÍçáÇÕÅAMPAllocate
ÇégǡǃÅAàÍìxÇ…ÉTÉCÉYÇÃëÂÇ´Ç»ÉÅÉÇÉäÉyÅ[ÉWÇàÍÇ¬ÇæÇØäÑÇËìñǃÅAïKóvÇ…âûÇ∂ǃÅAǪÇÃÉyÅ[ÉWÇ©ÇÁÇÊÇËè¨Ç≥Ç»ÉuÉçÉbÉNÇà¯Ç´èoǵNjÇ∑ÅB
ǂǡǃÇÕÇ¢ÇØÇ»Ç¢Ç±ÇΔ
68K ÇÃÉRÅ[ÉhÇåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBÉZÉJÉìÉhÉvÉçÉZÉbÉTè„Ç…ÇÕÉGÉ~ÉÖÉåÅ[É^Ç™ë∂ç›ÇµÇ»Ç¢ÇΩÇflÅAÉ~ÉbÉNÉXÉhÉÇÅ[ÉhÉXÉCÉbÉ`Çé¿çsǵÇÊǧÇΔÇ∑ÇÈÇΔÅAÉGÉâÅ[Ç™î≠ê∂ǵNjÇ∑ÅB
Toolbox ÇåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBToolbox Ç…ÇÕÅAåªç›Ç≈LJëÂó Çà 68K ÉRÅ[ÉhÇ™écǡǃǮÇËÅAÇ≥ÇÁÇ…à´Ç¢Ç±ÇΔDžǪÇÃëÂïîï™Ç™ÉmÉìÉäÉGÉìÉgÉâÉìÉg(çƒì¸ïsâ¬)Ç≈Ç∑ÅBÇΩÇΔǶnjÅAdžÇÈÉ^ÉXÉNÇ™
NewPtr ÇåƒÇ—èoǵǃǢǃÅAï ÇÃÉ^ÉXÉNLJ NewPtr ÇåƒÇ—èoÇ∑DZÇΔÇåàíËǵÇΩèÍçáÅAóºï˚ÇÃÉ^ÉXÉNÇÕNjǡÇΩÇ≠ìØéûÇ…ìØàÍÇÃÉOÉçÅ[ÉoÉãÉqÅ[Évç\ë¢ëÃÇéÊÇËàµÇ§Ç±ÇΔÇ…Ç»ÇËÅAÇ‹Ç∏ämé¿Ç…DZÇÃç\ë¢ëÃÇîjâÛǵǃǵNjǢNjÇ∑ÅBMac
OS 8 Ç≈ÇÕÅAÇ¢Ç≠ǬǩÇà Toolbox ÉãÅ[É`ÉìÇ™ MP É^ÉXÉNÇ©ÇÁåƒÇ—èoÇπÇÈÇÊǧDžǻÇËÇ‹Ç∑ÅBDZÇÍÇÁÇÃÉãÅ[É`ÉìÇÕ
Mac OS 8 ÇÃÉCÉìÉ^ÉtÉFÅ[ÉXÉtÉ@ÉCÉãÇÃíÜÇà FOR_SYSTEM8_PREEMPTIVE ÉtÉâÉOÇ…ÇÊǡǃèåèâªÇ≥ÇÍÇ‹Ç∑ÅB
ñ¢ímÇÃÉRÅ[ÉhÇåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBÉTÅ[ÉhÉpÅ[ÉeÉBÇ™ÉRÅ[ÉãÉoÉbÉNÇéwíËÇ∑ÇÈÇΩÇflÇÃï˚ñ@ÇíÒãüÇ∑ÇÈèÍçáÇÕÅAÉ^ÉXÉNÇ©ÇÁǪÇÃä÷êîÇåƒÇ—èoÇ≥ǻǢÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅBÉRÅ[ÉãÉoÉbÉNÇ™âΩÇé¿çsÇ∑ÇÈÇ©ÇÕÇÌÇ©ÇËÇ‹ÇπÇÒÅBDZÇÃÉãÅ[ÉãÇ…ÇÕê‚ëŒÇ…ǵÇΩǙǡǃÇ≠ÇæÇ≥Ç¢ÅBÉRÅ[ÉãÉoÉbÉNÇ™ÉäÉGÉìÉgÉâÉìÉgÇ≈džÇÈDZÇΔÇì¡Ç…óvãÅǵǻǢèÍçáÅAèÌDžǪǧÇ≈ǻǢâ¬î\ê´Ç™ë∂ç›Ç∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
ÉOÉçÅ[ÉoÉãÇîÇØÇƒÇ≠ÇæÇ≥Ç¢ÅBnon-reentrancy ÇÃéÂÇ»å¥àˆÇÕÉOÉçÅ[ÉoÉãÇÃéÊÇËàµÇ¢Ç…džÇËÇ‹Ç∑ÅBÉOÉçÅ[ÉoÉãÅAÉOÉçÅ[ÉoÉãÉXÉeÅ[ÉgÅAdžÇÈÇ¢ÇÕÉOÉçÅ[ÉoÉãÇ…ÇÊǡǃÉ|ÉCÉìÉgÇ≥ÇÍÇÈÉoÉbÉtÉ@ÇéÊÇËàµÇ§É^ÉXÉNÇÕÅAìØä˙ÉeÉNÉjÉbÉNÇégǡǃÅAëºÇÃÉ^ÉXÉNÇ™ìØéûÇ…ìØÇ∂èàóùÇçsÇÌǻǢÇÊǧDžÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBì«Ç›çûÇ›êÍópÇÃÉOÉçÅ[ÉoÉãÇ»ÇÁà¿ëSÇ≈Ç∑ÅB
äÑÇËçûÇ›éûÇ… MP API ÉãÅ[É`ÉìÇåƒÇ—èoÇ≥ǻǢÇ≈Ç≠ÇæÇ≥Ç¢ÅBåµñßÇ…åæÇ§ÇΔÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API ÉâÉCÉuÉâÉäÇÕÅAÉäÉGÉìÉgÉâÉìÉgÇ≈ÇÕdžÇËÇ‹ÇπÇÒÅBÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOÉ^ÉXÉNÇ©ÇÁÇÕÅAǢǬÇ≈LJîCà”ÇÃÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API ÉãÅ[É`ÉìÇåƒÇ—èoÇ∑DZÇΔÇ™Ç≈Ç´Ç‹Ç∑Ç™ÅAíxâÑÉ^ÉXÉNÅAÉ^ÉCÉÄÉ}ÉlÅ[ÉWÉÉÉ^ÉXÉNÅAdžÇÈÇ¢ÇÕǪÇÃëºÇÃÉVÉXÉeÉÄäÑÇËçûÇ›ÉnÉìÉhÉâÇ©ÇÁDZÇÍÇÁÇÃÉãÅ[É`ÉìÇåƒÇ—èoǵǃÇÕÇ¢ÇØÇ‹ÇπÇÒÅBâÒîï˚ñ@ÇÕë∂ç›ÇµÇ‹Ç∑Ç™ÅAǪÇÍÇÁÇÕïsè\ï™Ç»ëŒèàï˚ñ@Ç≈džÇËÅAàÍî ìIÇ…ÇÕÇ®ä©ÇflÇ≈Ç´Ç‹ÇπÇÒÅBè⁄ç◊DžǬǢǃÇÕÅAApple
DTS Ç‹ÇΩÇÕ DayStar Ç‹Ç≈Ç®ñ‚Ç¢çáÇÌÇπÇ≠ÇæÇ≥Ç¢ÅB
óvñÒ
DZÇà TECHNOTE Çì«Ç›èIÇÌÇÈÇΔÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉOëŒâûÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃäJî≠Ç…î∫ǧäÓñ{ìIÇ»ÉXÉeÉbÉvÇóùâÇ≈Ç´ÇÈÇÕÇ∏Ç≈Ç∑ÅBóvÇ∑ÇÈÇ…ÅAÉ}ÉãÉ`ÉvÉçÉZÉbÉVÉìÉO
API ÉâÉCÉuÉâÉäÇ™égópâ¬î\Ç≈džÇÈǩǫǧǩÇämîFÇ∑ÇÈïKóvǙdžÇËÅAÉvÉçÉZÉbÉTÇÃêîÇÉJÉEÉìÉgÇ∑ÇÈïKóvǙdžÇËÅAï°êîÇÃÉ^ÉXÉNÇìØä˙Ç≥ÇπÇÈÇΩÇflÇÃï˚ñ@ÇçÏê¨Ç∑ÇÈïKóvǙdžÇËÅAÇ≥ÇÁÇ…Ç∑Ç◊ǃÇÃÉvÉçÉZÉbÉTÇ™èÌÇ…ÉrÉWÅ[Ç≈džÇËë±ÇØÇÈÇÊǧDžè\ï™Ç»êîÇÃÉ^ÉXÉNÇçÏê¨Ç∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBÉ^ÉXÉNÇ™çÏê¨Ç≥ÇÍÇÈÇΔÅAÉ^ÉXÉNÇΔÇÃä‘Ç≈ÉÜÉjÅ[ÉNÇ»èÓïÒÇÇ‚ÇËéÊÇËÇ≈Ç´ÅAèàóùÇé¿çsÇ∑ÇÈïKóvǙdžÇÈÇΔÇ´ÅAÉ^ÉXÉNÇΔÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔÇÃä‘Ç≈í≤êÆÇçsǧDZÇΔÇ™â¬î\Ç…Ç»ÇËÇ‹Ç∑ÅBÉAÉvÉäÉPÅ[ÉVÉáÉìÇèIóπÇ∑ÇÈÇΔÇ´ÅAìØä˙ÉIÉuÉWÉFÉNÉgÇÕçÌèúÇ≥ÇÍÅAÉ^ÉXÉNLJèIóπÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB
Ç‹ÇΩÅAÉ^ÉXÉNÇ™é¿çsÇ≈Ç´ÇÈèàóùÇÃÉ^ÉCÉvÇ…èKènǵÅAìØéûÇ…É^ÉXÉNÇ™é¿çsÇ≈ǴǻǢLJÇÃLJê≥ǵÇ≠îFéØÇ≈Ç´ÇΩÇÕÇ∏Ç≈Ç∑ÅB
éQçlï∂å£
â¸í˘óöó
ÉIÉäÉWÉiÉãî≈ÇÕÅA1996 îN 7 åéÇ…èëÇ©ÇÍNjǵÇΩÅB
|
|