Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëÀí½â iOS ¿ª·¢ÖеÄËø
 
À´Ô´£ºÕÅÐÇÓî ·¢²¼ÓÚ£º 2017-3-31
  2241  次浏览      30
 

ÕªÒª

±¾ÎĵÄÄ¿µÄ²»ÊǽéÉÜ iOS Öи÷ÖÖËøÈçºÎʹÓã¬Ò»·½Ãæ±ÊÕßûÓдóÁ¿µÄʵս¾­Ñ飬ÁíÒ»·½ÃæÕâÑùµÄÎÄÕÂÏ൱¶à£¬±ÈÈç iOSÖб£Ö¤Ḭ̈߳²È«µÄ¼¸ÖÖ·½Ê½ÓëÐÔÄܶԱȡ¢iOS ³£¼û֪ʶµã£¨Èý£©£ºLock¡£±¾ÎÄÒ²²»»áÏêϸ½éÉÜËøµÄ¾ßÌåʵÏÖÔ­Àí£¬Õâ»áÉæ¼°µ½Ì«¶àÏà¹ØÖªÊ¶£¬±ÊÕß²»¸ÒÎóÈË×ӵܡ£

±¾ÎÄÒª×öµÄ¾ÍÊǼòµ¥µÄ·ÖÎö iOS ¿ª·¢Öг£¼ûµÄ¼¸ÖÖËøÈçºÎʵÏÖ£¬ÒÔ¼°ÓÅȱµãÊÇʲô£¬ÎªÊ²Ã´»áÓÐÐÔÄÜÉϵIJî¾à£¬×îÖÕ»á¼òµ¥µÄ½éÉÜËøµÄµ×²ãʵÏÖÔ­Àí¡£Ë®Æ½ÓÐÏÞ£¬Èç¹û²»É÷ÓÐÎ󣬻¶Ó­½»Á÷Ö¸Õý¡£Í¬Ê±½¨Òé¶ÁÕßÔÚÔĶÁ±¾ÎÄÒÔǰ£¬¶Ô OC Öи÷ÖÖËøµÄʹÓ÷½·¨ÏÈÓдó¸ÅµÄÈÏʶ¡£

ÔÚ ibireme µÄ ²»ÔÙ°²È«µÄ OSSpinLock Ò»ÎÄÖУ¬ÓÐÒ»ÕÅͼƬ¼òµ¥µÄ±È½ÏÁ˸÷ÖÖËøµÄ¼Ó½âËøÐÔÄÜ:

±¾ÎĻᰴÕÕ´ÓÉÏÖÁÏÂ(ËÙ¶ÈÓÉ¿ìÖÁÂý)µÄ˳Ðò·ÖÎöÿ¸öËøµÄʵÏÖÔ­Àí¡£ÐèҪ˵Ã÷µÄÊÇ£¬¼Ó½âËøËٶȲ»±íÊ¾ËøµÄЧÂÊ£¬Ö»±íʾ¼Ó½âËø²Ù×÷ÔÚÖ´ÐÐʱµÄ¸´Ôӳ̶ȣ¬ÏÂÎÄ»áͨ¹ý¾ßÌåµÄÀý×ÓÀ´½âÊÍ¡£

OSSpinLock

ÉÏÊöÎÄÕÂÖÐÒѾ­½éÉÜÁË OSSpinLock ²»ÔÙ°²È«£¬Ö÷ÒªÔ­Òò·¢ÉúÔÚµÍÓÅÏȼ¶Ïß³ÌÄõ½ËøÊ±£¬¸ßÓÅÏȼ¶Ï߳̽øÈëæµÈ(busy-wait)״̬£¬ÏûºÄ´óÁ¿ CPU ʱ¼ä£¬´Ó¶øµ¼ÖµÍÓÅÏȼ¶Ïß³ÌÄò»µ½ CPU ʱ¼ä£¬Ò²¾ÍÎÞ·¨Íê³ÉÈÎÎñ²¢ÊÍ·ÅËø¡£ÕâÖÖÎÊÌâ±»³ÆÎªÓÅÏȼ¶·´×ª¡£

ΪʲôæµÈ»áµ¼ÖµÍÓÅÏȼ¶Ïß³ÌÄò»µ½Ê±¼äƬ£¿Õ⻹µÃ´Ó²Ù×÷ϵͳµÄÏ̵߳÷¶È˵Æð¡£

ÏÖ´ú²Ù×÷ϵͳÔÚ¹ÜÀíÆÕͨÏß³Ìʱ£¬Í¨³£²ÉÓÃʱ¼äƬÂÖתËã·¨(Round Robin£¬¼ò³Æ RR)¡£Ã¿¸öÏ̻߳ᱻ·ÖÅäÒ»¶Îʱ¼äƬ(quantum)£¬Í¨³£ÔÚ 10-100 ºÁÃë×óÓÒ¡£µ±Ïß³ÌÓÃÍêÊôÓÚ×Ô¼ºµÄʱ¼äƬÒԺ󣬾ͻᱻ²Ù×÷ϵͳ¹ÒÆð£¬·ÅÈëµÈ´ý¶ÓÁÐÖУ¬Ö±µ½ÏÂÒ»´Î±»·ÖÅäʱ¼äƬ¡£

×ÔÐýËøµÄʵÏÖÔ­Àí

×ÔÐýËøµÄÄ¿µÄÊÇΪÁËÈ·±£ÁÙ½çÇøÖ»ÓÐÒ»¸öÏ߳̿ÉÒÔ·ÃÎÊ£¬ËüµÄʹÓÿÉÒÔÓÃÏÂÃæÕâ¶Îα´úÂëÀ´ÃèÊö:

do {  
Acquire Lock
Critical section // ÁÙ½çÇø
Release Lock
Reminder section // ²»ÐèÒªËø±£»¤µÄ´úÂë
}

ÔÚ Acquire Lock ÕâÒ»²½£¬ÎÒÃÇÉêÇë¼ÓËø£¬Ä¿µÄÊÇΪÁ˱£»¤ÁÙ½çÇø(Critical Section) ÖеĴúÂë²»»á±»¶à¸öÏß³ÌÖ´ÐС£

×ÔÐýËøµÄʵÏÖ˼·ºÜ¼òµ¥£¬ÀíÂÛÉÏÀ´ËµÖ»Òª¶¨ÒåÒ»¸öÈ«¾Ö±äÁ¿£¬ÓÃÀ´±íÊ¾ËøµÄ¿ÉÓÃÇé¿ö¼´¿É£¬Î±´úÂëÈçÏÂ:

bool lock = false; // Ò»¿ªÊ¼Ã»ÓÐËøÉÏ£¬ÈκÎÏ̶߳¼¿ÉÒÔÉêÇëËø  
do {
while(lock); // Èç¹û lock Ϊ true ¾ÍÒ»Ö±ËÀÑ­»·£¬Ï൱ÓÚÉêÇëËø
lock = true; // ¹ÒÉÏËø£¬ÕâÑù±ðµÄÏ߳̾ÍÎÞ·¨»ñµÃËø
Critical section // ÁÙ½çÇø
lock = false; // Ï൱ÓÚÊÍ·ÅËø£¬ÕâÑù±ðµÄÏ߳̿ÉÒÔ½øÈëÁÙ½çÇø
Reminder section // ²»ÐèÒªËø±£»¤µÄ´úÂë
}

×¢ÊÍдµÃºÜÇå³þ£¬¾Í²»ÔÙÖðÐзÖÎöÁË¡£¿ÉϧÕâ¶Î´úÂë´æÔÚÒ»¸öÎÊÌâ: Èç¹ûÒ»¿ªÊ¼Óжà¸öÏß³ÌͬʱִÐÐ while Ñ­»·£¬ËûÃǶ¼²»»áÔÚÕâÀ│ס£¬¶øÊǼÌÐøÖ´ÐУ¬ÕâÑù¾ÍÎÞ·¨±£Ö¤ËøµÄ¿É¿¿ÐÔÁË¡£½â¾ö˼·ҲºÜ¼òµ¥£¬Ö»ÒªÈ·±£ÉêÇëËøµÄ¹ý³ÌÊÇÔ­×Ó²Ù×÷¼´¿É¡£

Ô­×Ó²Ù×÷

ÏÁÒåÉϵÄÔ­×Ó²Ù×÷±íʾһÌõ²»¿É´ò¶ÏµÄ²Ù×÷£¬Ò²¾ÍÊÇ˵Ïß³ÌÔÚÖ´ÐвÙ×÷¹ý³ÌÖУ¬²»»á±»²Ù×÷ϵͳ¹ÒÆð£¬¶øÊÇÒ»¶¨»áÖ´ÐÐÍê¡£ÔÚµ¥´¦ÀíÆ÷»·¾³Ï£¬Ò»Ìõ»ã±àÖ¸ÁîÏÔÈ»ÊÇÔ­×Ó²Ù×÷£¬ÒòΪÖжÏҲҪͨ¹ýÖ¸ÁîÀ´ÊµÏÖ¡£

È»¶øÔÚ¶à´¦ÀíÆ÷µÄÇé¿öÏ£¬Äܹ»±»¶à¸ö´¦ÀíÆ÷ͬʱִÐеIJÙ×÷ÈÎÈ»Ëã²»ÉÏÔ­×Ó²Ù×÷¡£Òò´Ë£¬ÕæÕýµÄÔ­×Ó²Ù×÷±ØÐëÓÉÓ²¼þÌṩ֧³Ö£¬±ÈÈç x86 ƽ̨ÉÏÈç¹ûÔÚÖ¸ÁîÇ°Ãæ¼ÓÉÏ ¡°LOCK¡± ǰ׺£¬¶ÔÓ¦µÄ»úÆ÷ÂëÔÚÖ´ÐÐʱ»á°Ñ×ÜÏßËø×¡£¬Ê¹µÃÆäËû CPU²»ÄÜÔÙÖ´ÐÐÏàͬ²Ù×÷£¬´Ó¶ø´ÓÓ²¼þ²ãÃæÈ·±£Á˲Ù×÷µÄÔ­×ÓÐÔ¡£

ÕâЩ·Ç³£µ×²ãµÄ¸ÅÄîÎÞÐèÍêÈ«ÕÆÎÕ£¬ÎÒÃÇÖ»ÒªÖªµÀÉÏÊöÉêÇëËøµÄ¹ý³Ì£¬¿ÉÒÔÓÃÒ»¸öÔ­×ÓÐÔ²Ù×÷test_and_set À´Íê³É£¬ËüÓÃα´úÂë¿ÉÒÔÕâÑù±íʾ:

bool test_and_set (bool *target) {  
bool rv = *target;
*target = TRUE;
return rv;
}

Õâ¶Î´úÂëµÄ×÷ÓÃÊÇ°Ñ target µÄÖµÉèÖÃΪ 1£¬²¢·µ»ØÔ­À´µÄÖµ¡£µ±È»£¬ÔÚ¾ßÌåʵÏÖʱ£¬Ëüͨ¹ýÒ»¸öÔ­×ÓÐÔµÄÖ¸ÁîÀ´Íê³É¡£

×ÔÐýËøµÄ×ܽá

ÖÁ´Ë£¬×ÔÐýËøµÄʵÏÖÔ­Àí¾ÍºÜÇå³þÁË:

bool lock = false; // Ò»¿ªÊ¼Ã»ÓÐËøÉÏ£¬ÈκÎÏ̶߳¼¿ÉÒÔÉêÇëËø  
do {
while(test_and_set(&lock); // test_and_set ÊÇÒ»¸öÔ­×Ó²Ù×÷
Critical section // ÁÙ½çÇø
lock = false; // Ï൱ÓÚÊÍ·ÅËø£¬ÕâÑù±ðµÄÏ߳̿ÉÒÔ½øÈëÁÙ½çÇø
Reminder section // ²»ÐèÒªËø±£»¤µÄ´úÂë
}

Èç¹ûÁÙ½çÇøµÄÖ´ÐÐʱ¼ä¹ý³¤£¬Ê¹ÓÃ×ÔÐýËø²»ÊǸöºÃÖ÷Ò⡣֮ǰÎÒÃǽéÉܹýʱ¼äƬÂÖתËã·¨£¬Ïß³ÌÔÚ¶àÖÖÇé¿öÏ»áÍ˳ö×Ô¼ºµÄʱ¼äƬ¡£ÆäÖÐÒ»ÖÖÊÇÓÃÍêÁËʱ¼äƬµÄʱ¼ä£¬±»²Ù×÷ÏµÍ³Ç¿ÖÆÇÀÕ¼¡£³ý´ËÒÔÍ⣬µ±Ï߳̽øÐÐ I/O ²Ù×÷£¬»ò½øÈë˯Ãß״̬ʱ£¬¶¼»áÖ÷¶¯Èóöʱ¼äƬ¡£ÏÔÈ»ÔÚ while Ñ­»·ÖУ¬Ï̴߳¦ÓÚæµÈ״̬£¬°×°×ÀË·Ñ CPU ʱ¼ä£¬×îÖÕÒòΪ³¬Ê±±»²Ù×÷ϵͳÇÀռʱ¼äƬ¡£Èç¹ûÁÙ½çÇøÖ´ÐÐʱ¼ä½Ï³¤£¬±ÈÈçÊÇÎļþ¶Áд£¬ÕâÖÖæµÈÊǺÁÎÞ±ØÒªµÄ¡£

ÐźÅÁ¿

֮ǰÎÒÔÚ ½éÉÜ GCD µ×²ãʵÏÖµÄÎÄÕ Öмòµ¥ÃèÊöÁËÐźÅÁ¿ dispatch_semaphore_t µÄʵÏÖÔ­Àí£¬Ëü×îÖÕ»áµ÷Óõ½ sem_wait ·½·¨£¬Õâ¸ö·½·¨ÔÚ glibc Öб»ÊµÏÖÈçÏÂ:

int sem_wait (sem_t *sem) {  
int *futex = (int *) sem;
if (atomic_decrement_if_positive (futex) > 0)
return 0;
int err = lll_futex_wait (futex, 0);
return -1;
)

Ê×ÏÈ»á°ÑÐźÅÁ¿µÄÖµ¼õÒ»£¬²¢ÅжÏÊÇ·ñ´óÓÚÁã¡£Èç¹û´óÓÚÁ㣬˵Ã÷²»Óõȴý£¬ËùÒÔÁ¢¿Ì·µ»Ø¡£¾ßÌåµÄµÈ´ý²Ù×÷ÔÚ lll_futex_wait º¯ÊýÖÐʵÏÖ£¬lll ÊÇ low level lock µÄ¼ò³Æ¡£Õâ¸öº¯Êýͨ¹ý»ã±à´úÂëʵÏÖ£¬µ÷Óõ½ SYS_futex Õâ¸öϵͳµ÷Óã¬Ê¹Ï߳̽øÈë˯Ãß״̬£¬Ö÷¶¯Èóöʱ¼äƬ£¬Õâ¸öº¯ÊýÔÚ»¥³âËøµÄʵÏÖÖУ¬Ò²ÓпÉÄܱ»Óõ½¡£

Ö÷¶¯Èóöʱ¼äƬ²¢²»×ÜÊÇ´ú±íЧÂʸߡ£Èóöʱ¼äƬ»áµ¼Ö²Ù×÷ϵͳÇл»µ½ÁíÒ»¸öỊ̈߳¬ÕâÖÖÉÏÏÂÎÄÇл»Í¨³£ÐèÒª 10 ΢Ãë×óÓÒ£¬¶øÇÒÖÁÉÙÐèÒªÁ½´ÎÇл»¡£Èç¹ûµÈ´ýʱ¼äºÜ¶Ì£¬±ÈÈçÖ»Óм¸¸ö΢Ã룬æµÈ¾Í±ÈÏß³Ì˯Ã߸ü¸ßЧ¡£

¿ÉÒÔ¿´µ½£¬×ÔÐýËøºÍÐźÅÁ¿µÄʵÏÖ¶¼·Ç³£¼òµ¥£¬ÕâÒ²ÊÇÁ½ÕߵļӽâËøºÄʱ·Ö±ðÅÅÔÚµÚÒ»ºÍµÚ¶þµÄÔ­Òò¡£ÔÙ´ÎÇ¿µ÷£¬¼Ó½âËøºÄʱ²»ÄÜ׼ȷ·´Ó¦³öËøµÄЧÂÊ(±ÈÈçʱ¼äƬÇл»¾ÍÎÞ·¨·¢Éú)£¬ËüÖ»ÄÜ´ÓÒ»¶¨³Ì¶ÈÉϺâÁ¿ËøµÄʵÏÖ¸´Ôӳ̶ȡ£

pthread_mutex

pthread ±íʾ POSIX thread£¬¶¨ÒåÁËÒ»×é¿çƽ̨µÄÏß³ÌÏà¹ØµÄ API£¬pthread_mutex ±íʾ»¥³âËø¡£»¥³âËøµÄʵÏÖÔ­ÀíÓëÐźÅÁ¿·Ç³£ÏàËÆ£¬²»ÊÇʹÓÃæµÈ£¬¶øÊÇ×èÈûÏ̲߳¢Ë¯Ãߣ¬ÐèÒª½øÐÐÉÏÏÂÎÄÇл»¡£

»¥³âËøµÄ³£¼ûÓ÷¨ÈçÏÂ:

pthread_mutexattr_t attr;  
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL); // ¶¨ÒåËøµÄÊôÐÔ

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, &attr) // ´´½¨Ëø

pthread_mutex_lock(&mutex); // ÉêÇëËø
// ÁÙ½çÇø
pthread_mutex_unlock(&mutex); // ÊÍ·ÅËø

¶ÔÓÚ pthread_mutex À´Ëµ£¬ËüµÄÓ÷¨ºÍ֮ǰûÓÐÌ«´óµÄ¸Ä±ä£¬±È½ÏÖØÒªµÄÊÇËøµÄÀàÐÍ£¬¿ÉÒÔÓÐPTHREAD_MUTEX_NORMAL¡¢PTHREAD_MUTEX_ERRORCHECK¡¢PTHREAD_MUTEX_RECURSIVE µÈµÈ£¬¾ßÌåµÄÌØÐԾͲ»×ö½âÊÍÁË£¬ÍøÉÏÓкܶàÏà¹Ø×ÊÁÏ¡£

Ò»°ãÇé¿öÏ£¬Ò»¸öÏß³ÌÖ»ÄÜÉêÇëÒ»´ÎËø£¬Ò²Ö»ÄÜÔÚ»ñµÃËøµÄÇé¿öϲÅÄÜÊÍ·ÅËø£¬¶à´ÎÉêÇëËø»òÊÍ·Åδ»ñµÃµÄËø¶¼»áµ¼Ö±ÀÀ£¡£¼ÙÉèÔÚÒѾ­»ñµÃËøµÄÇé¿öÏÂÔÙ´ÎÉêÇëËø£¬Ï̻߳áÒòΪµÈ´ýËøµÄÊͷŶø½øÈë˯Ãß״̬£¬Òò´Ë¾Í²»¿ÉÄÜÔÙÊÍ·ÅËø£¬´Ó¶øµ¼ÖÂËÀËø¡£

È»¶øÕâÖÖÇé¿ö¾­³£»á·¢Éú£¬±ÈÈçij¸öº¯ÊýÉêÇëÁËËø£¬ÔÚÁÙ½çÇøÄÚÓֵݹéµ÷ÓÃÁË×Ô¼º¡£ÐÁÔ˵ÄÊÇpthread_mutex Ö§³ÖµÝ¹éËø£¬Ò²¾ÍÊÇÔÊÐíÒ»¸öÏ̵߳ݹéµÄÉêÇëËø£¬Ö»Òª°Ñ attr µÄÀàÐ͸ijÉPTHREAD_MUTEX_RECURSIVE ¼´¿É¡£

»¥³âËøµÄʵÏÖ

»¥³âËøÔÚÉêÇëËøÊ±£¬µ÷ÓÃÁË pthread_mutex_lock ·½·¨£¬ËüÔÚ²»Í¬µÄϵͳÉÏʵÏÖ¸÷Óв»Í¬£¬ÓÐʱºòËüµÄÄÚ²¿ÊÇʹÓÃÐźÅÁ¿À´ÊµÏÖ£¬¼´Ê¹²»ÓÃÐźÅÁ¿£¬Ò²»áµ÷Óõ½ lll_futex_wait º¯Êý£¬´Ó¶øµ¼ÖÂÏß³ÌÐÝÃß¡£

ÉÏÎÄ˵µ½Èç¹ûÁÙ½çÇøºÜ¶Ì£¬Ã¦µÈµÄЧÂÊÒ²Ðí¸ü¸ß£¬ËùÒÔÔÚÓÐЩ°æ±¾µÄʵÏÖÖУ¬»áÊ×Ïȳ¢ÊÔÒ»¶¨´ÎÊý(±ÈÈç 1000 ´Î)µÄ testandtest£¬ÕâÑù¿ÉÒÔÔÚ´íÎóʹÓû¥³âËøÊ±Ìá¸ßÐÔÄÜ¡£

ÁíÍ⣬ÓÉÓÚ pthread_mutex ÓжàÖÖÀàÐÍ£¬¿ÉÒÔÖ§³ÖµÝ¹éËøµÈ£¬Òò´ËÔÚÉêÇë¼ÓËøÊ±£¬ÐèÒª¶ÔËøµÄÀàÐͼÓÒÔÅжϣ¬ÕâÒ²¾ÍÊÇΪʲôËüºÍÐźÅÁ¿µÄʵÏÖÀàËÆ£¬µ«Ð§ÂÊÂԵ͵ÄÔ­Òò¡£

NSLock

NSLock ÊÇ Objective-C ÒÔ¶ÔÏóµÄÐÎʽ±©Â¶¸ø¿ª·¢ÕßµÄÒ»ÖÖËø£¬ËüµÄʵÏַdz£¼òµ¥£¬Í¨¹ýºê£¬¶¨ÒåÁË lock ·½·¨:

#define    MLOCK \
- (void) lock\
{\
int err = pthread_mutex_lock(&_mutex);\
// ´íÎó´¦Àí ¡­¡­
}

NSLock Ö»ÊÇÔÚÄÚ²¿·â×°ÁËÒ»¸ö pthread_mutex£¬ÊôÐÔΪ PTHREAD_MUTEX_ERRORCHECK£¬Ëü»áËðʧһ¶¨ÐÔÄÜ»»À´´íÎóÌáʾ¡£

ÕâÀïʹÓú궨ÒåµÄÔ­ÒòÊÇ£¬OC ÄÚ²¿»¹ÓÐÆäËû¼¸ÖÖËø£¬ËûÃÇµÄ lock ·½·¨¶¼ÊÇһģһÑù£¬½ö½öÊÇÄÚ²¿ pthread_mutex »¥³âËøµÄÀàÐͲ»Í¬¡£Í¨¹ýºê¶¨Ò壬¿ÉÒÔ¼ò»¯·½·¨µÄ¶¨Òå¡£

NSLock ±È pthread_mutex ÂÔÂýµÄÔ­ÒòÔÚÓÚËüÐèÒª¾­¹ý·½·¨µ÷Óã¬Í¬Ê±ÓÉÓÚ»º´æµÄ´æÔÚ£¬¶à´Î·½·¨µ÷Óò»»á¶ÔÐÔÄܲúÉúÌ«´óµÄÓ°Ïì¡£

NSCondition

NSCondition µÄµ×²ãÊÇͨ¹ýÌõ¼þ±äÁ¿(condition variable) pthread_cond_t À´ÊµÏֵġ£Ìõ¼þ±äÁ¿ÓеãÏñÐźÅÁ¿£¬ÌṩÁËÏß³Ì×èÈûÓëÐźŻúÖÆ£¬Òò´Ë¿ÉÒÔÓÃÀ´×èÈûij¸öỊ̈߳¬²¢µÈ´ýij¸öÊý¾Ý¾ÍÐ÷£¬Ëæºó»½ÐÑỊ̈߳¬±ÈÈç³£¼ûµÄÉú²úÕß-Ïû·ÑÕßģʽ¡£

ÈçºÎʹÓÃÌõ¼þ±äÁ¿

ºÜ¶à½éÉÜ pthread_cond_t µÄÎÄÕ¶¼»áÌáµ½£¬ËüÐèÒªÓ뻥³âËøÅäºÏʹÓÃ:

void consumer () { // Ïû·ÑÕß  
pthread_mutex_lock(&mutex);
while (data == NULL) {
pthread_cond_wait(&condition_variable_signal, &mutex); // µÈ´ýÊý¾Ý
}
// --- ÓÐеÄÊý¾Ý£¬ÒÔÏ´úÂ븺Ôð´¦Àí ¡ý¡ý¡ý¡ý¡ý¡ý
// temp = data;
// --- ÓÐеÄÊý¾Ý£¬ÒÔÉÏ´úÂ븺Ôð´¦Àí ¡ü¡ü¡ü¡ü¡ü¡ü
pthread_mutex_unlock(&mutex);
}

void producer () {
pthread_mutex_lock(&mutex);
// Éú²úÊý¾Ý
pthread_cond_signal(&condition_variable_signal); // ·¢³öÐźŸøÏû·ÑÕߣ¬¸æËßËûÃÇÓÐÁËеÄÊý¾Ý
pthread_mutex_unlock(&mutex);
}

×ÔÈ»ÎÒÃÇ»áÓÐÒÉÎÊ:¡°Èç¹û²»Óû¥³âËø£¬Ö»ÓÃÌõ¼þ±äÁ¿»áÓÐʲôÎÊÌâÄØ£¿¡±¡£ÎÊÌâÔÚÓÚ£¬temp = data; Õâ¶Î´úÂë²»ÊÇḬ̈߳²È«µÄ£¬Ò²ÐíÔÚÄã°Ñ data ¶Á³öÀ´ÒÔǰ£¬ÒѾ­ÓбðµÄÏß³ÌÐÞ¸ÄÁËÊý¾Ý¡£Òò´ËÎÒÃÇÐèÒª±£Ö¤Ïû·ÑÕßÄõ½µÄÊý¾ÝÊÇḬ̈߳²È«µÄ¡£

wait ·½·¨³ýÁ˻ᱻ signal ·½·¨»½ÐÑ£¬ÓÐʱ»¹»á±»Ðé¼Ù»½ÐÑ£¬ËùÒÔÐèÒªÕâÀï while Ñ­»·ÖеÄÅжÏÀ´×ö¶þ´ÎÈ·ÈÏ¡£

ΪʲôҪʹÓÃÌõ¼þ±äÁ¿

½éÉÜÌõ¼þ±äÁ¿µÄÎÄÕ·dz£¶à£¬µ«´ó¶à¶¼¶ÔÒ»¸öÒ»¸ö»ù±¾ÎÊÌâ±Ü¶ø²»Ì¸:¡°ÎªÊ²Ã´ÒªÓÃÌõ¼þ±äÁ¿£¿Ëü½ö½öÊÇ¿ØÖÆÁËÏ̵߳ÄÖ´ÐÐ˳Ðò£¬ÓÃÐźÅÁ¿»òÕß»¥³âËøÄܲ»ÄÜÄ£Äâ³öÀàËÆÐ§¹û£¿¡±

ÍøÉϵÄÏà¹Ø×ÊÁϱȽÏÉÙ£¬ÎÒ¼òµ¥ËµÒ»Ï¸öÈË¿´·¨¡£ÐźÅÁ¿¿ÉÒÔÒ»¶¨³Ì¶ÈÉÏÌæ´ú condition£¬µ«ÊÇ»¥³âËø²»ÐС£ÔÚÒÔÉϸø³öµÄÉú²úÕß-Ïû·ÑÕßģʽµÄ´úÂëÖУ¬ pthread_cond_wait ·½·¨µÄ±¾ÖÊÊÇËøµÄ×ªÒÆ£¬Ïû·ÑÕß·ÅÆúËø£¬È»ºóÉú²úÕß»ñµÃËø£¬Í¬Àí£¬pthread_cond_signal ÔòÊÇÒ»¸öËø´ÓÉú²úÕßµ½Ïû·ÑÕß×ªÒÆµÄ¹ý³Ì¡£

Èç¹ûʹÓû¥³âËø£¬ÎÒÃÇÐèÒª°Ñ´úÂë¸Ä³ÉÕâÑù:

void consumer () { // Ïû·ÑÕß  
pthread_mutex_lock(&mutex);
while (data == NULL) {
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&another_lock) // Ï൱ÓÚ wait ÁíÒ»¸ö»¥³âËø
pthread_mutex_lock(&mutex);
}
pthread_mutex_unlock(&mutex);
}

ÕâÑù×ö´æÔÚµÄÎÊÌâÔÚÓÚ£¬Ôڵȴý anotherlock ֮ǰ£¬ Éú²úÕßÓпÉÄÜÏÈÖ´ÐдúÂ룬 ´Ó¶øÊÍ·ÅÁË anotherlock¡£Ò²¾ÍÊÇ˵£¬ÎÒÃÇÎÞ·¨±£Ö¤ÊÍ·ÅËøºÍµÈ´ýÁíÒ»¸öËøÕâÁ½¸ö²Ù×÷ÊÇÔ­×ÓÐԵģ¬Ò²¾ÍÎÞ·¨±£Ö¤¡°Ïȵȴý¡¢ºóÊÍ·Å another_lock¡± Õâ¸ö˳Ðò¡£

ÓÃÐźÅÁ¿Ôò²»´æÔÚÕâ¸öÎÊÌ⣬ÒòΪÐźÅÁ¿µÄµÈ´ýºÍ»½ÐѲ¢²»ÐèÒªÂú×ãÏȺó˳Ðò£¬ÐźÅÁ¿Ö»±íʾÓжàÉÙ¸ö×ÊÔ´¿ÉÓã¬Òò´Ë²»´æÔÚÉÏÊöÎÊÌ⡣Ȼ¶øÓë pthread_cond_wait ±£Ö¤µÄÔ­×ÓÐÔËø×ªÒÆÏà±È£¬Ê¹ÓÃÐźÅÁ¿Ëƺõ´æÔÚÒ»¶¨·çÏÕ(ÔÝʱûÓв鵽·ÇÔ­×ÓÐÔ²Ù×÷Óкβ»Í×)¡£

²»¹ý£¬Ê¹Óà condition ÓÐÒ»¸öºÃ´¦£¬ÎÒÃÇ¿ÉÒÔµ÷Óà pthread_cond_broadcast ·½·¨Í¨ÖªËùÓеȴýÖеÄÏû·ÑÕߣ¬ÕâÊÇʹÓÃÐźÅÁ¿ÎÞ·¨ÊµÏֵġ£

NSCondition µÄ×ö·¨

NSCondition ÆäʵÊÇ·â×°ÁËÒ»¸ö»¥³âËøºÍÌõ¼þ±äÁ¿£¬ Ëü°ÑǰÕßµÄ lock ·½·¨ºÍºóÕßµÄ wait/signalͳһÔÚ NSCondition ¶ÔÏóÖУ¬±©Â¶¸øÊ¹ÓÃÕß:

- (void) signal {
pthread_cond_signal(&_condition);
}

// ÆäʵÕâ¸öº¯ÊýÊÇͨ¹ýºêÀ´¶¨ÒåµÄ£¬Õ¹¿ªºó¾ÍÊÇÕâÑù
- (void) lock {
int err = pthread_mutex_lock(&_mutex);
}

ËüµÄ¼Ó½âËø¹ý³ÌÓë NSLock ¼¸ºõÒ»Ö£¬ÀíÂÛÉÏÀ´ËµºÄʱҲӦ¸ÃÒ»Ñù(ʵ¼Ê²âÊÔÒ²ÊÇÈç´Ë)¡£ÔÚͼÖÐÏÔʾËüºÄʱÂÔ³¤£¬ÎҲ²âÓпÉÄÜÊDzâÊÔÕßÔÚÿ´Î¼Ó½âËøµÄǰºó»¹¸½´øÁ˱äÁ¿µÄ³õʼ»¯ºÍÏú»Ù²Ù×÷¡£

NSRecursiveLock

ÉÏÎÄÒѾ­Ëµ¹ý£¬µÝ¹éËøÒ²ÊÇͨ¹ý pthread_mutex_lock º¯ÊýÀ´ÊµÏÖ£¬ÔÚº¯ÊýÄÚ²¿»áÅжÏËøµÄÀàÐÍ£¬Èç¹ûÏÔʾÊǵݹéËø£¬¾ÍÔÊÐíµÝ¹éµ÷Ó㬽ö½ö½«Ò»¸ö¼ÆÊýÆ÷¼ÓÒ»£¬ËøµÄÊͷŹý³ÌÒ²ÊÇͬÀí¡£

NSRecursiveLock Óë NSLock µÄÇø±ðÔÚÓÚÄÚ²¿·â×°µÄ pthread_mutex_t ¶ÔÏóµÄÀàÐͲ»Í¬£¬Ç°ÕßµÄÀàÐÍΪ PTHREAD_MUTEX_RECURSIVE¡£

NSConditionLock

NSConditionLock ½èÖú NSCondition À´ÊµÏÖ£¬ËüµÄ±¾ÖʾÍÊÇÒ»¸öÉú²úÕß-Ïû·ÑÕßÄ£ÐÍ¡£¡°Ìõ¼þ±»Âú×㡱¿ÉÒÔÀí½âΪÉú²úÕßÌṩÁËеÄÄÚÈÝ¡£NSConditionLock µÄÄÚ²¿³ÖÓÐÒ»¸ö NSCondition ¶ÔÏó£¬ÒÔ¼°_condition_value ÊôÐÔ£¬ÔÚ³õʼ»¯Ê±¾Í»á¶ÔÕâ¸öÊôÐÔ½øÐи³Öµ:

// ¼ò»¯°æ´úÂë
- (id) initWithCondition: (NSInteger)value {
if (nil != (self = [super init])) {
_condition = [NSCondition new]
_condition_value = value;
}
return self;
}

ËüµÄ lockWhenCondition ·½·¨Æäʵ¾ÍÊÇÏû·ÑÕß·½·¨:

- (void) lockWhenCondition: (NSInteger)value {
[_condition lock];
while (value != _condition_value) {
[_condition wait];
}
}

¶ÔÓ¦µÄ unlockWhenCondition ·½·¨ÔòÊÇÉú²úÕߣ¬Ê¹ÓÃÁË broadcast ·½·¨Í¨ÖªÁËËùÓеÄÏû·ÑÕß:

- (void) unlockWithCondition: (NSInteger)value {
_condition_value = value;
[_condition broadcast];
[_condition unlock];
}

@synchronized

ÕâÆäʵÊÇÒ»¸ö OC ²ãÃæµÄËø£¬ Ö÷ÒªÊÇͨ¹ýÎþÉüÐÔÄÜ»»À´Óï·¨Éϵļò½àÓë¿É¶Á¡£

ÎÒÃÇÖªµÀ @synchronized ºóÃæÐèÒª½ô¸úÒ»¸ö OC ¶ÔÏó£¬Ëüʵ¼ÊÉÏÊǰÑÕâ¸ö¶ÔÏóµ±×öËøÀ´Ê¹Óá£ÕâÊÇͨ¹ýÒ»¸ö¹þÏ£±íÀ´ÊµÏֵģ¬OC ÔڵײãʹÓÃÁËÒ»¸ö»¥³âËøµÄÊý×é(Äã¿ÉÒÔÀí½âÎªËø³Ø)£¬Í¨¹ý¶Ô¶ÔÏóÈ¥¹þÏ£ÖµÀ´µÃµ½¶ÔÓ¦µÄ»¥³âËø¡£

   
2241 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ