ÔÚPosix ThreadÖж¨ÒåÓÐÒ»Ì×רÃÅÓÃÓÚÏß³Ìͬ²½µÄmutexº¯Êý¡£
¡¡¡¡1£® ´´½¨ºÍÏú»Ù
¡¡¡¡ÓÐÁ½ÖÖ·½·¨´´½¨»¥³âËø£¬¾²Ì¬·½Ê½ºÍ¶¯Ì¬·½Ê½¡£POSIX¶¨ÒåÁËÒ»¸öºêPTHREAD_MUTEX_INITIALIZERÀ´¾²Ì¬³õʼ»¯»¥³âËø£¬·½·¨ÈçÏ£º pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; ÔÚLinuxThreadsʵÏÖÖУ¬pthread_mutex_tÊÇÒ»¸ö½á¹¹£¬¶øPTHREAD_MUTEX_INITIALIZERÔòÊÇÒ»¸ö½á¹¹³£Á¿¡£
¡¡¡¡¶¯Ì¬·½Ê½ÊDzÉÓÃpthread_mutex_init()º¯ÊýÀ´³õʼ»¯»¥³âËø£¬API¶¨ÒåÈçÏ£º int pthread_mutex_init(pthread_mutex_t mutex, const pthread_mutexattr_t mutexattr) ÆäÖÐmutexattrÓÃÓÚÖ¸¶¨»¥³âËøÊôÐÔ£¨¼ûÏ£©£¬Èç¹ûΪNULLÔòʹÓÃȱʡÊôÐÔ¡£
¡¡¡¡pthread_mutex_destroy ()ÓÃÓÚ×¢ÏúÒ»¸ö»¥³âËø£¬API¶¨ÒåÈçÏ£º int pthread_mutex_destroy(pthread_mutex_t mutex) Ïú»ÙÒ»¸ö»¥³âËø¼´Òâζ×ÅÊÍ·ÅËüËùÕ¼ÓõÄ×ÊÔ´£¬ÇÒÒªÇóËøµ±Ç°´¦ÓÚ¿ª·Å״̬¡£ÓÉÓÚÔÚLinuxÖУ¬»¥³âËø²¢²»Õ¼ÓÃÈκÎ×ÊÔ´£¬Òò´ËLinuxThreadsÖÐµÄ pthread_mutex_destroy()³ýÁ˼ì²éËø״̬ÒÔÍ⣨Ëø¶¨×´Ì¬Ôò·µ»ØEBUSY£©Ã»ÓÐÆäËû¶¯×÷¡£
¡¡¡¡2£® »¥³âËøÊôÐÔ
¡¡¡¡»¥³âËøµÄÊôÐÔÔÚ´´½¨ËøµÄʱºòÖ¸¶¨£¬ÔÚLinuxThreadsʵÏÖÖнöÓÐÒ»¸öËøÀàÐÍÊôÐÔ£¬²»Í¬µÄËøÀàÐÍÔÚÊÔͼ¶ÔÒ»¸öÒѾ±»Ëø¶¨µÄ»¥³âËø¼ÓËøʱ±íÏÖ²»Í¬¡£µ±Ç°£¨glibc2.2.3,linuxthreads0.9£©ÓÐËĸöÖµ¿É¹©Ñ¡Ôñ£º
¡¡¡¡ PTHREAD_MUTEX_TIMED_NP£¬ÕâÊÇȱʡֵ£¬Ò²¾ÍÊÇÆÕͨËø¡£µ±Ò»¸öÏ̼߳ÓËøÒÔºó£¬ÆäÓàÇëÇóËøµÄÏ߳̽«ÐγÉÒ»¸öµÈ´ý¶ÓÁУ¬²¢ÔÚ½âËøºó°´ÓÅÏȼ¶»ñµÃËø¡£ÕâÖÖËø²ßÂÔ±£Ö¤ÁË×ÊÔ´·ÖÅäµÄ¹«Æ½ÐÔ¡£
¡¡¡¡ PTHREAD_MUTEX_RECURSIVE_NP£¬Ç¶Ì×Ëø£¬ÔÊÐíͬһ¸öÏ̶߳Ôͬһ¸öËø³É¹¦»ñµÃ¶à´Î£¬²¢Í¨¹ý¶à´Îunlock½âËø¡£Èç¹ûÊDz»Í¬Ïß³ÌÇëÇó£¬ÔòÔÚ¼ÓËøÏ߳̽âËøʱÖØоºÕù¡£
¡¡¡¡ PTHREAD_MUTEX_ERRORCHECK_NP£¬¼ì´íËø£¬Èç¹ûͬһ¸öÏß³ÌÇëÇóͬһ¸öËø£¬Ôò·µ»ØEDEADLK£¬·ñÔòÓëPTHREAD_MUTEX_TIMED_NPÀàÐͶ¯×÷Ïàͬ¡£ÕâÑù¾Í±£Ö¤µ±²»ÔÊÐí¶à´Î¼ÓËøʱ²»»á³öÏÖ×î¼òµ¥Çé¿öϵÄËÀËø¡£
¡¡¡¡ PTHREAD_MUTEX_ADAPTIVE_NP£¬ÊÊÓ¦Ëø£¬¶¯×÷×î¼òµ¥µÄËøÀàÐÍ£¬½öµÈ´ý½âËøºóÖØоºÕù¡£
¡¡¡¡3£® Ëø²Ù×÷
¡¡¡¡Ëø²Ù×÷Ö÷Òª°üÀ¨¼ÓËøpthread_mutex_lock()¡¢½âËøpthread_mutex_unlock()ºÍ²âÊÔ¼ÓËø pthread_mutex_trylock()Èý¸ö£¬²»ÂÛÄÄÖÖÀàÐ͵ÄËø£¬¶¼²»¿ÉÄܱ»Á½¸ö²»Í¬µÄÏß³ÌͬʱµÃµ½£¬¶ø±ØÐëµÈ´ý½âËø¡£¶ÔÓÚÆÕͨËøºÍÊÊÓ¦ËøÀàÐÍ£¬½âËøÕß¿ÉÒÔÊÇͬ½ø³ÌÄÚÈκÎỊ̈߳»¶ø¼ì´íËøÔò±ØÐëÓɼÓËøÕß½âËø²ÅÓÐЧ£¬·ñÔò·µ»ØEPERM£»¶ÔÓÚǶÌ×Ëø£¬ÎĵµºÍʵÏÖÒªÇó±ØÐëÓɼÓËøÕß½âËø£¬µ«ÊµÑé½á¹û±íÃ÷²¢Ã»ÓÐÕâÖÖÏÞÖÆ£¬Õâ¸ö²»Í¬Ä¿Ç°»¹Ã»Óеõ½½âÊÍ¡£ÔÚͬһ½ø³ÌÖеÄỊ̈߳¬Èç¹û¼ÓËøºóûÓнâËø£¬ÔòÈκÎÆäËûÏ̶߳¼ÎÞ·¨ÔÙ»ñµÃËø¡£
¡¡¡¡int pthread_mutex_lock(pthread_mutex_t mutex)
¡¡¡¡int pthread_mutex_unlock(pthread_mutex_t mutex)
¡¡¡¡int pthread_mutex_trylock(pthread_mutex_t mutex)
¡¡¡¡pthread_mutex_trylock()ÓïÒåÓëpthread_mutex_lock()ÀàËÆ£¬²»Í¬µÄÊÇÔÚËøÒѾ±»Õ¼¾Ýʱ·µ»ØEBUSY¶ø²»ÊǹÒÆðµÈ´ý¡£
¡¡¡¡4£® ÆäËû
¡¡¡¡POSIX Ïß³ÌËø»úÖƵÄLinuxʵÏÖ¶¼²»ÊÇÈ¡Ïûµã£¬Òò´Ë£¬ÑÓ³ÙÈ¡ÏûÀàÐ͵ÄÏ̲߳»»áÒòÊÕµ½È¡ÏûÐźŶøÀ뿪¼ÓËøµÈ´ý¡£ÖµµÃ×¢ÒâµÄÊÇ£¬Èç¹ûÏß³ÌÔÚ¼ÓËøºó½âËøÇ°±»È¡Ïû£¬Ëø½«ÓÀÔ¶±£³ÖËø¶¨×´Ì¬£¬Òò´ËÈç¹ûÔڹؼüÇø¶ÎÄÚÓÐÈ¡Ïûµã´æÔÚ£¬»òÕßÉèÖÃÁËÒ첽ȡÏûÀàÐÍ£¬Ôò±ØÐëÔÚÍ˳ö»Øµ÷º¯ÊýÖнâËø¡£
¡¡¡¡Õâ¸öËø»úÖÆͬʱҲ²»ÊÇÒì²½ÐźŰ²È«µÄ£¬Ò²¾ÍÊÇ˵£¬²»Ó¦¸ÃÔÚÐźŴ¦Àí¹ý³ÌÖÐʹÓû¥³âËø£¬·ñÔòÈÝÒ×Ôì³ÉËÀËø¡£
¡¡¡¡»¥³âËøÊôÐÔʹÓû¥³âËø£¨»¥³â£©¿ÉÒÔʹḬ̈߳´Ë³ÐòÖ´ÐС£Í¨³££¬»¥³âËøͨ¹ýÈ·±£Ò»´ÎÖ»ÓÐÒ»¸öÏß³ÌÖ´ÐдúÂëµÄÁÙ½ç¶ÎÀ´Í¬²½¶à¸öÏ̡߳£»¥³âËø»¹¿ÉÒÔ±£»¤µ¥Ï̴߳úÂë¡£
¡¡¡¡Òª¸ü¸ÄȱʡµÄ»¥³âËøÊôÐÔ£¬¿ÉÒÔ¶ÔÊôÐÔ¶ÔÏó½øÐÐÉùÃ÷ºÍ³õʼ»¯¡£Í¨³££¬»¥³âËøÊôÐÔ»áÉèÖÃÔÚÓ¦ÓóÌÐò¿ªÍ·µÄij¸öλÖã¬ÒÔ±ã¿ÉÒÔ¿ìËÙ²éÕÒºÍÇáËÉÐ޸ġ£±í 4¨C1 ÁгöÁËÓÃÀ´´¦Àí»¥³âËøÊôÐԵĺ¯Êý¡£
¡¡¡¡±í 4¨C1 »¥³âËøÊôÐÔÀý³Ì
²Ù×÷ Ïà¹Øº¯Êý˵Ã÷
³õʼ»¯»¥³âËøÊôÐÔ¶ÔÏó pthread_mutexattr_init Óï·¨
Ïú»Ù»¥³âËøÊôÐÔ¶ÔÏó pthread_mutexattr_destroy Óï·¨
ÉèÖû¥³âËø·¶Î§ pthread_mutexattr_setpshared Óï·¨
»ñÈ¡»¥³âËø·¶Î§ pthread_mutexattr_getpshared Óï·¨
ÉèÖû¥³âËøµÄÀàÐÍÊôÐÔ pthread_mutexattr_settype Óï·¨
»ñÈ¡»¥³âËøµÄÀàÐÍÊôÐÔ pthread_mutexattr_gettype Óï·¨
ÉèÖû¥³âËøÊôÐÔµÄÐÒé pthread_mutexattr_setprotocol Óï·¨
»ñÈ¡»¥³âËøÊôÐÔµÄÐÒé pthread_mutexattr_getprotocol Óï·¨
ÉèÖû¥³âËøÊôÐÔµÄÓÅÏȼ¶ÉÏÏÞ pthread_mutexattr_setprioceiling Óï·¨
»ñÈ¡»¥³âËøÊôÐÔµÄÓÅÏȼ¶ÉÏÏÞ pthread_mutexattr_getprioceiling Óï·¨
ÉèÖû¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ pthread_mutex_setprioceiling Óï·¨
»ñÈ¡»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ pthread_mutex_getprioceiling Óï·¨
ÉèÖû¥³âËøµÄÇ¿½¡ÊôÐÔ pthread_mutexattr_setrobust_np Óï·¨
»ñÈ¡»¥³âËøµÄÇ¿½¡ÊôÐÔ pthread_mutexattr_getrobust_np Óï·¨
¡¡±í 4¨C2 ÖÐÏÔʾÁËÔÚ¶¨Ò廥³â·¶Î§Ê± Solaris Ïß³ÌºÍ POSIX Ïß³ÌÖ®¼äµÄ²îÒì¡£
¡¡¡¡±í 4¨C2 »¥³âËø·¶Î§±È½Ï
Solaris POSIX ¶¨Òå
USYNC_PROCESS PTHREAD_PROCESS_SHARED ÓÃÓÚͬ²½¸Ã½ø³ÌºÍÆäËû½ø³ÌÖеÄÏß³Ì
USYNC_PROCESS_ROBUST ÎÞ POSIX µÈЧÏî ÓÃÓÚÔÚ½ø³Ì¼ä¿É¿¿µØͬ²½Ïß³Ì
USYNC_THREAD PTHREAD_PROCESS_PRIVATE ÓÃÓÚ½öͬ²½¸Ã½ø³ÌÖеÄÏß³Ì
³õʼ»¯»¥³âËøÊôÐÔ¶ÔÏó¡¡¡¡Ê¹Óà pthread_mutexattr_init(3C)¿ÉÒÔ½«Ó뻥³âËø¶ÔÏóÏà¹ØÁªµÄÊôÐÔ³õʼ»¯ÎªÆäȱʡֵ¡£ÔÚÖ´Ðйý³ÌÖУ¬Ïß³Ìϵͳ»áΪÿ¸öÊôÐÔ¶ÔÏó·ÖÅä´æ´¢¿Õ¼ä¡£ pthread_mutexattr_init Óï·¨¡¡¡¡int pthread_mutexattr_init(pthread_mutexattr_t mattr);
¡¡¡¡#include pthread.h
¡¡¡¡pthread_mutexattr_t mattr;
¡¡¡¡int ret; initialize an attribute to default value
¡¡¡¡ret = pthread_mutexattr_init(&mattr);
¡¡¡¡µ÷Óô˺¯Êýʱ£¬pshared ÊôÐÔµÄȱʡֵΪ PTHREAD_PROCESS_PRIVATE¡£¸ÃÖµ±íʾ¿ÉÒÔÔÚ½ø³ÌÄÚʹÓþ¹ý³õʼ»¯µÄ»¥³âËø¡£
¡¡¡¡mattr µÄÀàÐÍΪ opaque£¬ÆäÖаüº¬Ò»¸öÓÉϵͳ·ÖÅäµÄÊôÐÔ¶ÔÏó¡£mattr ·¶Î§¿ÉÄܵÄֵΪ PTHREAD_PROCESS_PRIVATE ºÍ PTHREAD_PROCESS_SHARED¡£PTHREAD_PROCESS_PRIVATE ÊÇȱʡֵ¡£
¡¡¡¡¶ÔÓÚ»¥³âËøÊôÐÔ¶ÔÏ󣬱ØÐëÊ×ÏÈͨ¹ýµ÷Óà pthread_mutexattr_destroy(3C) ½«ÆäÏú»Ù£¬²ÅÄÜÖØгõʼ»¯¸Ã¶ÔÏó¡£pthread_mutexattr_init()µ÷ÓûᵼÖ·ÖÅäÀàÐÍΪ opaque µÄ¶ÔÏó¡£Èç¹ûδÏú»Ù¸Ã¶ÔÏó£¬Ôò»áµ¼ÖÂÄÚ´æй©¡£ pthread_mutexattr_init ·µ»ØÖµ¡¡¡¡pthread_mutexattr_init()³É¹¦Íê³ÉÖ®ºó»á·µ»ØÁã¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£Èç¹û³öÏÖÒÔÏÂÇé¿ö£¬¸Ãº¯Êý½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡ENOMEM
¡¡¡¡ÃèÊö ÄÚ´æ²»×㣬ÎÞ·¨³õʼ»¯»¥³âËøÊôÐÔ¶ÔÏó¡£
Ïú»Ù»¥³âËøÊôÐÔ¶ÔÏó¡¡¡¡pthread_mutexattr_destroy(3C) ¿ÉÓÃÀ´È¡Ïû·ÖÅäÓÃÓÚά»¤ pthread_mutexattr_init() Ëù´´½¨µÄÊôÐÔ¶ÔÏóµÄ´æ´¢¿Õ¼ä¡£ pthread_mutexattr_destroy Óï·¨¡¡¡¡int pthread_mutexattr_destroy(pthread_mutexattr_t mattr)#include pthread.hpthread_mutexattr_t mattr;int ret; destroy an attribute ret = pthread_mutexattr_destroy(&mattr); pthread_mutexattr_destroy ·µ»ØÖµ¡¡¡¡pthread_mutexattr_destroy() ³É¹¦Íê³ÉÖ®ºó»á·µ»ØÁã¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£Èç¹û³öÏÖÒÔÏÂÇé¿ö£¬¸Ãº¯Êý½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö ÓÉ mattr Ö¸¶¨µÄÖµÎÞЧ¡£
ÉèÖû¥³âËøµÄ·¶Î§¡¡¡¡pthread_mutexattr_setpshared(3C) ¿ÉÓÃÀ´ÉèÖû¥³âËø±äÁ¿µÄ×÷ÓÃÓò¡£ pthread_mutexattr_setpshared Óï·¨¡¡¡¡int pthread_mutexattr_setpshared(pthread_mutexattr_t mattr, int pshared);#include pthread.hpthread_mutexattr_t mattr;int ret;ret = pthread_mutexattr_init(&mattr); resetting to its default value private ret = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_PRIVATE);»¥³âËø±äÁ¿¿ÉÒÔÊǽø³ÌרÓõģ¨½ø³ÌÄÚ£©±äÁ¿£¬Ò²¿ÉÒÔÊÇϵͳ·¶Î§Äڵģ¨½ø³Ì¼ä£©±äÁ¿¡£ÒªÔÚ¶à¸ö½ø³ÌÖеÄÏß³ÌÖ®¼ä¹²Ïí»¥³âËø£¬¿ÉÒÔÔÚ¹²ÏíÄÚ´æÖд´½¨»¥³âËø£¬²¢½« pshared ÊôÐÔÉèÖÃΪ PTHREAD_PROCESS_SHARED¡£ ´ËÐÐΪÓë×î³õµÄ Solaris Ïß³ÌʵÏÖÖÐ mutex_init() ÖÐµÄ USYNC_PROCESS ±êÖ¾µÈЧ¡£
¡¡¡¡Èç¹û»¥³âËøµÄ pshared ÊôÐÔÉèÖÃΪ PTHREAD_PROCESS_PRIVATE£¬Ôò½öÓÐÄÇЩÓÉͬһ¸ö½ø³Ì´´½¨µÄÏ̲߳ÅÄܹ»´¦Àí¸Ã»¥³âËø¡£ pthread_mutexattr_setpshared ·µ»ØÖµ¡¡¡¡pthread_mutexattr_setpshared() ³É¹¦Íê³ÉÖ®ºó»á·µ»ØÁã¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£Èç¹û³öÏÖÒÔÏÂÇé¿ö£¬¸Ãº¯Êý½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö ÓÉ mattr Ö¸¶¨µÄÖµÎÞЧ¡£
»ñÈ¡»¥³âËøµÄ·¶Î§¡¡¡¡pthread_mutexattr_getpshared(3C) ¿ÉÓÃÀ´·µ»ØÓÉ pthread_mutexattr_setpshared() ¶¨ÒåµÄ»¥³âËø±äÁ¿µÄ·¶Î§¡£ pthread_mutexattr_getpshared Óï·¨¡¡¡¡int pthread_mutexattr_getpshared(pthread_mutexattr_t mattr, int pshared);#include pthread.hpthread_mutexattr_t mattr;int pshared, ret; get pshared of mutex ret = pthread_mutexattr_getpshared(&mattr, &pshared); ´Ëº¯Êý¿ÉΪÊôÐÔ¶ÔÏó mattr »ñÈ¡ pshared µÄµ±Ç°Öµ¡£¸ÃֵΪ PTHREAD_PROCESS_SHARED »ò PTHREAD_PROCESS_PRIVATE¡£ pthread_mutexattr_getpshared ·µ»ØÖµ¡¡¡¡pthread_mutexattr_getpshared() ³É¹¦Íê³ÉÖ®ºó»á·µ»ØÁã¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£Èç¹û³öÏÖÒÔÏÂÇé¿ö£¬¸Ãº¯Êý½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö ÓÉ mattr Ö¸¶¨µÄÖµÎÞЧ¡£
ÉèÖû¥³âËøÀàÐ͵ÄÊôÐÔ¡¡¡¡pthread_mutexattr_settype(3C) ¿ÉÓÃÀ´ÉèÖû¥³âËøµÄ type ÊôÐÔ¡£ pthread_mutexattr_settype Óï·¨¡¡¡¡#include pthread.hint pthread_mutexattr_settype(pthread_mutexattr_t attr , int type);ÀàÐÍÊôÐÔµÄȱʡֵΪ PTHREAD_MUTEX_DEFAULT¡£
¡¡¡¡type ²ÎÊýÖ¸¶¨»¥³âËøµÄÀàÐÍ¡£ÒÔÏÂÁгöÁËÓÐЧµÄ»¥³âËøÀàÐÍ£º
¡¡¡¡PTHREAD_MUTEX_NORMAL
¡¡¡¡ÃèÊö ´ËÀàÐ͵Ļ¥³âËø²»»á¼ì²âËÀËø¡£Èç¹ûÏß³ÌÔÚ²»Ê×ÏȽâ³ý»¥³âËøµÄÇé¿öϳ¢ÊÔÖØÐÂËø¶¨¸Ã»¥³âËø£¬Ôò»á²úÉúËÀËø¡£³¢ÊÔ½â³ýÓÉÆäËûÏß³ÌËø¶¨µÄ»¥³âËø»á²úÉú²»È·¶¨µÄÐÐΪ¡£Èç¹û³¢ÊÔ½â³ýËø¶¨µÄ»¥³âËøδËø¶¨£¬Ôò»á²úÉú²»È·¶¨µÄÐÐΪ¡£
¡¡¡¡PTHREAD_MUTEX_ERRORCHECK
¡¡¡¡ÃèÊö ´ËÀàÐ͵Ļ¥³âËø¿ÉÌṩ´íÎó¼ì²é¡£Èç¹ûÏß³ÌÔÚ²»Ê×ÏȽâ³ýËø¶¨»¥³âËøµÄÇé¿öϳ¢ÊÔÖØÐÂËø¶¨¸Ã»¥³âËø£¬Ôò»á·µ»Ø´íÎó¡£Èç¹ûÏ̳߳¢ÊÔ½â³ýËø¶¨µÄ»¥³âËøÒѾÓÉÆäËûÏß³ÌËø¶¨£¬Ôò»á·µ»Ø´íÎó¡£Èç¹ûÏ̳߳¢ÊÔ½â³ýËø¶¨µÄ»¥³âËøδËø¶¨£¬Ôò»á·µ»Ø´íÎó¡£
¡¡¡¡PTHREAD_MUTEX_RECURSIVE
¡¡¡¡ÃèÊö Èç¹ûÏß³ÌÔÚ²»Ê×ÏȽâ³ýËø¶¨»¥³âËøµÄÇé¿öϳ¢ÊÔÖØÐÂËø¶¨¸Ã»¥³âËø£¬Ôò¿É³É¹¦Ëø¶¨¸Ã»¥³âËø¡£ Óë PTHREAD_MUTEX_NORMAL ÀàÐ͵Ļ¥³âËø²»Í¬£¬¶Ô´ËÀàÐÍ»¥³âËø½øÐÐÖØÐÂËø¶¨Ê±²»»á²úÉúËÀËøÇé¿ö¡£¶à´ÎËø¶¨»¥³âËøÐèÒª½øÐÐÏàͬ´ÎÊýµÄ½â³ýËø¶¨²Å¿ÉÒÔÊͷŸÃËø£¬È»ºóÆäËûÏ̲߳ÅÄÜ»ñÈ¡¸Ã»¥³âËø¡£Èç¹ûÏ̳߳¢ÊÔ½â³ýËø¶¨µÄ»¥³âËøÒѾÓÉÆäËûÏß³ÌËø¶¨£¬Ôò»á·µ»Ø´íÎó¡£ Èç¹ûÏ̳߳¢ÊÔ½â³ýËø¶¨µÄ»¥³âËøδËø¶¨£¬Ôò»á·µ»Ø´íÎó¡£
¡¡¡¡PTHREAD_MUTEX_DEFAULT
¡¡¡¡ÃèÊö Èç¹û³¢ÊÔÒԵݹ鷽ʽËø¶¨´ËÀàÐ͵Ļ¥³âËø£¬Ôò»á²úÉú²»È·¶¨µÄÐÐΪ¡£¶ÔÓÚ²»ÊÇÓɵ÷ÓÃÏß³ÌËø¶¨µÄ´ËÀàÐÍ»¥³âËø£¬Èç¹û³¢ÊÔ¶ÔËü½â³ýËø¶¨£¬Ôò»á²úÉú²»È·¶¨µÄÐÐΪ¡£¶ÔÓÚÉÐδËø¶¨µÄ´ËÀàÐÍ»¥³âËø£¬Èç¹û³¢ÊÔ¶ÔËü½â³ýËø¶¨£¬Ò²»á²úÉú²»È·¶¨µÄÐÐΪ¡£ÔÊÐíÔÚʵÏÖÖн«¸Ã»¥³âËøÓ³Éäµ½ÆäËû»¥³âËøÀàÐÍÖ®Ò»¡£¶ÔÓÚ Solaris Ị̈߳¬PTHREAD_PROCESS_DEFAULT »áÓ³Éäµ½ PTHREAD_PROCESS_NORMAL¡£ pthread_mutexattr_settype ·µ»ØÖµ¡¡¡¡Èç¹ûÔËÐгɹ¦£¬pthread_mutexattr_settype º¯Êý»á·µ»ØÁã¡£·ñÔò£¬½«·µ»ØÓÃÓÚÖ¸Ã÷´íÎóµÄ´íÎóºÅ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö ֵΪ type ÎÞЧ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö attr Ö¸¶¨µÄÖµÎÞЧ¡£
»ñÈ¡»¥³âËøµÄÀàÐÍÊôÐÔ¡¡¡¡pthread_mutexattr_gettype(3C) ¿ÉÓÃÀ´»ñÈ¡ÓÉ pthread_mutexattr_settype() ÉèÖõĻ¥³âËøµÄ type ÊôÐÔ¡£ pthread_mutexattr_gettype Óï·¨¡¡¡¡#include pthread.hint pthread_mutexattr_gettype(pthread_mutexattr_t attr , int type);ÀàÐÍÊôÐÔµÄȱʡֵΪ PTHREAD_MUTEX_DEFAULT¡£
¡¡¡¡type ²ÎÊýÖ¸¶¨»¥³âËøµÄÀàÐÍ¡£ÓÐЧµÄ»¥³âËøÀàÐÍ°üÀ¨£º
¡¡¡¡PTHREAD_MUTEX_NORMAL
¡¡¡¡PTHREAD_MUTEX_ERRORCHECK
¡¡¡¡PTHREAD_MUTEX_RECURSIVE
¡¡¡¡PTHREAD_MUTEX_DEFAULT
¡¡¡¡ÓйØÿÖÖÀàÐ͵Ä˵Ã÷£¬Çë²Î¼ûpthread_mutexattr_settype Óï·¨¡£ pthread_mutexattr_gettype ·µ»ØÖµ¡¡¡¡Èç¹û³É¹¦Íê³É£¬pthread_mutexattr_gettype() »á·µ»Ø 0¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£
ÉèÖû¥³âËøÊôÐÔµÄÐÒé¡¡¡¡pthread_mutexattr_setprotocol(3C) ¿ÉÓÃÀ´ÉèÖû¥³âËøÊôÐÔ¶ÔÏóµÄÐÒéÊôÐÔ¡£ pthread_mutexattr_setprotocol Óï·¨¡¡¡¡#include pthread.hint pthread_mutexattr_setprotocol(pthread_mutexattr_t attr, int protocol);attr ָʾÒÔÇ°µ÷Óà pthread_mutexattr_init() ʱ´´½¨µÄ»¥³âËøÊôÐÔ¶ÔÏó¡£
¡¡¡¡protocol ¿É¶¨ÒåÓ¦ÓÃÓÚ»¥³âËøÊôÐÔ¶ÔÏóµÄÐÒé¡£
¡¡¡¡pthread.h Öж¨ÒåµÄ protocol ¿ÉÒÔÊÇÒÔÏÂÖµÖ®Ò»£ºPTHREAD_PRIO_NONE¡¢PTHREAD_PRIO_INHERIT »ò PTHREAD_PRIO_PROTECT¡£
¡¡¡¡PTHREAD_PRIO_NONE
¡¡¡¡Ï̵߳ÄÓÅÏȼ¶ºÍµ÷¶È²»»áÊܵ½»¥³âËøÓµÓÐȨµÄÓ°Ïì¡£
¡¡¡¡PTHREAD_PRIO_INHERIT
¡¡¡¡´ËÐÒéÖµ£¨Èç thrd1£©»áÓ°ÏìÏ̵߳ÄÓÅÏȼ¶ºÍµ÷¶È¡£Èç¹û¸ü¸ßÓÅÏȼ¶µÄÏß³ÌÒò thrd1 ËùÓµÓеÄÒ»¸ö»ò¶à¸ö»¥³âËø¶ø±»×èÈû£¬¶øÕâЩ»¥³âËøÊÇÓà PTHREAD_PRIO_INHERIT ³õʼ»¯µÄ£¬Ôò thrd1 ½«ÒÔ¸ßÓÚËüµÄÓÅÏȼ¶»òÕßËùÓÐÕýÔڵȴýÕâЩ»¥³âËø£¨ÕâЩ»¥³âËøÊÇ thrd1 Ö¸ËùÓµÓеĻ¥³âËø£©µÄÏ̵߳Ä×î¸ßÓÅÏȼ¶ÔËÐС£
¡¡¡¡Èç¹û thrd1 ÒòÁíÒ»¸öÏß³Ì (thrd3) ÓµÓеĻ¥³âËø¶ø±»×èÈû£¬ÔòÏàͬµÄÓÅÏȼ¶¼Ì³ÐЧӦ»áÒԵݹ鷽ʽ´«²¥¸ø thrd3¡£
¡¡¡¡Ê¹Óà PTHREAD_PRIO_INHERIT ¿ÉÒÔ±ÜÃâÓÅÏȼ¶µ¹ÖᣵÍÓÅÏȼ¶µÄÏ̳߳ÖÓнϸßÓÅÏȼ¶Ïß³ÌËùÐèµÄËøʱ£¬±ã»á·¢ÉúÓÅÏȼ¶µ¹Öá£Ö»ÓÐÔڽϵÍÓÅÏȼ¶µÄÏß³ÌÊͷŸÃËøÖ®ºó£¬½Ï¸ßÓÅÏȼ¶µÄÏ̲߳ÅÄܼÌÐøʹÓøÃËø¡£ÉèÖà PTHREAD_PRIO_INHERIT£¬ÒԱ㰴ÓëÔ¤ÆÚµÄÓÅÏȼ¶Ïà·´µÄÓÅÏȼ¶´¦Àíÿ¸öÏ̡߳£
¡¡¡¡Èç¹ûΪʹÓÃÐÒéÊôÐÔÖµ PTHREAD_PRIO_INHERIT ³õʼ»¯µÄ»¥³âËø¶¨ÒåÁË _POSIX_THREAD_PRIO_INHERIT£¬Ôò»¥³âËøµÄÊôÖ÷ʧ°Üʱ»áÖ´ÐÐÒÔϲÙ×÷¡£ÊôÖ÷ʧ°ÜʱµÄÐÐΪȡ¾öÓÚ pthread_mutexattr_setrobust_np() µÄ robustness ²ÎÊýµÄÖµ¡£
¡¡¡¡½â³ýËø¶¨»¥³âËø¡£
¡¡¡¡»¥³âËøµÄÏÂÒ»¸öÊôÖ÷½«»ñÈ¡¸Ã»¥³âËø£¬²¢·µ»Ø´íÎó EOWNERDEAD¡£
¡¡¡¡»¥³âËøµÄÏÂÒ»¸öÊôÖ÷»á³¢ÊÔʹ¸Ã»¥³âËøËù±£»¤µÄ״̬һÖ¡£Èç¹ûÉÏÒ»¸öÊôÖ÷ʧ°Ü£¬Ôò״̬¿ÉÄܻ᲻һÖ¡£Èç¹ûÊôÖ÷³É¹¦Ê¹×´Ì¬±£³ÖÒ»Ö£¬Ôò¿ÉÕë¶Ô¸Ã»¥³âËøµ÷Óà pthread_mutex_init() ²¢½â³ýËø¶¨¸Ã»¥³âËø¡£
¡¡¡¡×¢ ¨C Èç¹ûÕë¶ÔÒÔÇ°³õʼ»¯µÄµ«ÉÐδÏú»ÙµÄ»¥³âËøµ÷Óà pthread_mutex_init()£¬Ôò¸Ã»¥³âËø²»»áÖØгõʼ»¯¡£
¡¡¡¡Èç¹ûÊôÖ÷ÎÞ·¨Ê¹×´Ì¬±£³ÖÒ»Ö£¬ÇëÎðµ÷Óà pthread_mutex_init()£¬¶øÊǽâ³ýËø¶¨¸Ã»¥³âËø¡£ÔÚÕâÖÖÇé¿öÏ£¬ËùÓеȴýµÄÏ̶߳¼½«±»»½ÐÑ¡£ÒÔºó¶Ô pthread_mutex_lock() µÄËùÓе÷Óý«ÎÞ·¨»ñÈ¡»¥³âËø£¬²¢½«·µ»Ø´íÎó´úÂë ENOTRECOVERABLE¡£ÏÖÔÚ£¬Í¨¹ýµ÷Óà pthread_mutex_destroy() À´È¡Ïû³õʼ»¯¸Ã»¥³âËø£¬¼´¿ÉʹÆä״̬±£³ÖÒ»Ö¡£µ÷Óà pthread_mutex_init() ¿ÉÖØгõʼ»¯»¥³âËø¡£
¡¡¡¡Èç¹ûÒÑ»ñÈ¡¸ÃËøµÄÏß³Ìʧ°Ü²¢·µ»Ø EOWNERDEAD£¬ÔòÏÂÒ»¸öÊôÖ÷½«»ñÈ¡¸ÃËø¼°´íÎó´úÂë EOWNERDEAD¡£
¡¡¡¡PTHREAD_PRIO_PROTECT
¡¡¡¡µ±Ïß³ÌÓµÓÐÒ»¸ö»ò¶à¸öʹÓà PTHREAD_PRIO_PROTECT ³õʼ»¯µÄ»¥³âËøʱ£¬´ËÐÒéÖµ»áÓ°ÏìÆäËûỊ̈߳¨Èç thrd2£©µÄÓÅÏȼ¶ºÍµ÷¶È¡£thrd2 ÒÔÆä½Ï¸ßµÄÓÅÏȼ¶»òÕßÒÔ thrd2 ÓµÓеÄËùÓл¥³âËøµÄ×î¸ßÓÅÏȼ¶ÉÏÏÞÔËÐС£»ùÓÚ±» thrd2 ÓµÓеÄÈÎÒ»»¥³âËø×èÈûµÄ½Ï¸ßÓÅÏȼ¶Ï̶߳ÔÓÚ thrd2 µÄµ÷¶ÈûÓÐÈκÎÓ°Ïì¡£
¡¡¡¡Èç¹ûij¸öÏ̵߳÷Óà sched_setparam() À´¸ü¸Ä³õʼÓÅÏȼ¶£¬Ôòµ÷¶È³ÌÐò²»»á²ÉÓÃÐÂÓÅÏȼ¶½«¸ÃÏß³ÌÒƵ½µ÷¶È¶ÓÁÐĩβ¡£
¡¡¡¡Ïß³ÌÓµÓÐʹÓà PTHREAD_PRIO_INHERIT »ò PTHREAD_PRIO_PROTECT ³õʼ»¯µÄ»¥³âËø
¡¡¡¡Ï߳̽â³ýËø¶¨Ê¹Óà PTHREAD_PRIO_INHERIT »ò PTHREAD_PRIO_PROTECT ³õʼ»¯µÄ»¥³âËø
¡¡¡¡Ò»¸öÏ߳̿ÉÒÔͬʱӵÓжà¸ö»ìºÏʹÓà PTHREAD_PRIO_INHERIT ºÍ PTHREAD_PRIO_PROTECT ³õʼ»¯µÄ»¥³âËø¡£ÔÚÕâÖÖÇé¿öÏ£¬¸ÃÏ߳̽«ÒÔͨ¹ýÆäÖÐÈÎÒ»ÐÒé»ñÈ¡µÄ×î¸ßÓÅÏȼ¶Ö´ÐС£ pthread_mutexattr_setprotocol ·µ»ØÖµ¡¡¡¡Èç¹û³É¹¦Íê³É£¬pthread_mutexattr_setprotocol() »á·µ»Ø 0¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexattr_setprotocol() ½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö Ñ¡Ïî _POSIX_THREAD_PRIO_INHERIT ºÍ _POSIX_THREAD_PRIO_PROTECT ¾ù䶨Òå²¢ÇÒ¸ÃʵÏÖ²»Ö§³Ö´Ëº¯Êý¡£
¡¡¡¡ENOTSUP
¡¡¡¡ÃèÊö protocol Ö¸¶¨µÄÖµ²»ÊÜÖ§³Ö¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexattr_setprotocol() ¿ÉÄÜ»áʧ°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö attr »ò protocol Ö¸¶¨µÄÖµÎÞЧ¡£
¡¡¡¡EPERM
¡¡¡¡ÃèÊö µ÷Ó÷½ÎÞȨִÐиòÙ×÷¡£
»ñÈ¡»¥³âËøÊôÐÔµÄÐÒé¡¡¡¡pthread_mutexattr_getprotocol(3C) ¿ÉÓÃÀ´»ñÈ¡»¥³âËøÊôÐÔ¶ÔÏóµÄÐÒéÊôÐÔ¡£ pthread_mutexattr_getprotocol Óï·¨¡¡¡¡#include pthread.hint pthread_mutexattr_getprotocol(const pthread_mutexattr_t attr, int protocol);attr ָʾÒÔÇ°µ÷Óà pthread_mutexattr_init() ʱ´´½¨µÄ»¥³âËøÊôÐÔ¶ÔÏó¡£
¡¡¡¡protocol °üº¬ÒÔÏÂÐÒéÊôÐÔÖ®Ò»£ºPTHREAD_PRIO_NONE¡¢PTHREAD_PRIO_INHERIT »ò PTHREAD_PRIO_PROTECT¡£ pthread_mutexattr_getprotocol ·µ»ØÖµ¡¡¡¡Èç¹û³É¹¦Íê³É£¬pthread_mutexattr_getprotocol() »á·µ»Ø 0¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÇé¿ö£¬pthread_mutexattr_getprotocol() ½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö _POSIX_THREAD_PRIO_INHERIT Ñ¡ÏîºÍ _POSIX_THREAD_PRIO_PROTECT Ñ¡Ïî¾ù䶨Òå²¢ÇÒ¸ÃʵÏÖ²»Ö§³Ö´Ëº¯Êý¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexattr_getprotocol() ¿ÉÄÜ»áʧ°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö attr Ö¸¶¨µÄÖµÎÞЧ¡£
¡¡¡¡EPERM
¡¡¡¡ÃèÊö µ÷Ó÷½ÎÞȨִÐиòÙ×÷¡£
ÉèÖû¥³âËøÊôÐÔµÄÓÅÏȼ¶ÉÏÏÞ¡¡¡¡pthread_mutexattr_setprioceiling(3C) ¿ÉÓÃÀ´ÉèÖû¥³âËøÊôÐÔ¶ÔÏóµÄÓÅÏȼ¶ÉÏÏÞÊôÐÔ¡£ pthread_mutexattr_setprioceiling Óï·¨¡¡¡¡#include pthread.hint pthread_mutexattr_setprioceiling(pthread_mutexatt_t attr, int prioceiling, int oldceiling);attr ָʾÒÔÇ°µ÷Óà pthread_mutexattr_init() ʱ´´½¨µÄ»¥³âËøÊôÐÔ¶ÔÏó¡£
¡¡¡¡prioceiling Ö¸¶¨Òѳõʼ»¯»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ¡£ÓÅÏȼ¶ÉÏÏÞ¶¨ÒåÖ´Ðл¥³âËø±£»¤µÄÁÙ½ç¶ÎʱµÄ×îµÍÓÅÏȼ¶¡£prioceiling λÓÚ SCHED_FIFO Ëù¶¨ÒåµÄÓÅÏȼ¶µÄ×î´ó·¶Î§ÄÚ¡£Òª±ÜÃâÓÅÏȼ¶µ¹Öã¬Ç뽫 prioceiling ÉèÖÃΪ¸ßÓÚ»òµÈÓÚ¿ÉÄÜ»áËø¶¨Ìض¨»¥³âËøµÄËùÓÐÏ̵߳Ä×î¸ßÓÅÏȼ¶¡£
¡¡¡¡oldceiling °üº¬ÒÔÇ°µÄÓÅÏȼ¶ÉÏÏÞÖµ¡£ pthread_mutexattr_setprioceiling ·µ»ØÖµ¡¡¡¡Èç¹û³É¹¦Íê³É£¬pthread_mutexattr_setprioceiling() »á·µ»Ø 0¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexattr_setprioceiling() ½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö Ñ¡Ïî _POSIX_THREAD_PRIO_PROTECT 䶨Òå²¢ÇÒ¸ÃʵÏÖ²»Ö§³Ö´Ëº¯Êý¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexattr_setprioceiling() ¿ÉÄÜ»áʧ°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö attr »ò prioceiling Ö¸¶¨µÄÖµÎÞЧ¡£
¡¡¡¡EPERM
¡¡¡¡ÃèÊö µ÷Ó÷½ÎÞȨִÐиòÙ×÷¡£
»ñÈ¡»¥³âËøÊôÐÔµÄÓÅÏȼ¶ÉÏÏÞ¡¡¡¡pthread_mutexattr_getprioceiling(3C) ¿ÉÓÃÀ´»ñÈ¡»¥³âËøÊôÐÔ¶ÔÏóµÄÓÅÏȼ¶ÉÏÏÞÊôÐÔ¡£ pthread_mutexattr_getprioceiling Óï·¨¡¡¡¡#include pthread.hint pthread_mutexattr_getprioceiling(const pthread_mutexatt_t attr, int prioceiling);attr Ö¸¶¨ÒÔÇ°µ÷Óà pthread_mutexattr_init() ʱ´´½¨µÄÊôÐÔ¶ÔÏó¡£
¡¡¡¡×¢ ¨C
¡¡¡¡½öµ±¶¨ÒåÁË _POSIX_THREAD_PRIO_PROTECT ·ûºÅʱ£¬attr »¥³âËøÊôÐÔ¶ÔÏó²Å»á°üÀ¨ÓÅÏȼ¶ÉÏÏÞÊôÐÔ¡£
¡¡¡¡pthread_mutexattr_getprioceiling() ·µ»Ø prioceiling ÖÐÒѳõʼ»¯»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ¡£ÓÅÏȼ¶ÉÏÏÞ¶¨ÒåÖ´Ðл¥³âËø±£»¤µÄÁÙ½ç¶ÎʱµÄ×îµÍÓÅÏȼ¶¡£prioceiling λÓÚ SCHED_FIFO Ëù¶¨ÒåµÄÓÅÏȼ¶µÄ×î´ó·¶Î§ÄÚ¡£Òª±ÜÃâÓÅÏȼ¶µ¹Öã¬Ç뽫 prioceiling ÉèÖÃΪ¸ßÓÚ»òµÈÓÚ¿ÉÄÜ»áËø¶¨Ìض¨»¥³âËøµÄËùÓÐÏ̵߳Ä×î¸ßÓÅÏȼ¶¡£ pthread_mutexattr_getprioceiling ·µ»ØÖµ¡¡¡¡Èç¹û³É¹¦Íê³É£¬pthread_mutexattr_getprioceiling() »á·µ»Ø 0¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexattr_getprioceiling() ½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö _POSIX_THREAD_PRIO_PROTECT Ñ¡Ïî䶨Òå²¢ÇÒ¸ÃʵÏÖ²»Ö§³Ö´Ëº¯Êý¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexattr_getprioceiling() ¿ÉÄÜ»áʧ°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö attr Ö¸¶¨µÄÖµÎÞЧ¡£
¡¡¡¡EPERM
¡¡¡¡ÃèÊö µ÷Ó÷½ÎÞȨִÐиòÙ×÷¡£
ÉèÖû¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ¡¡¡¡pthread_mutexattr_setprioceiling(3C) ¿ÉÓÃÀ´ÉèÖû¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ¡£ pthread_mutex_setprioceiling Óï·¨¡¡¡¡#include pthread.hint pthread_mutex_setprioceiling(pthread_mutex_t mutex, int prioceiling, int old_ceiling);pthread_mutex_setprioceiling() ¿É¸ü¸Ä»¥³âËø mutex µÄÓÅÏȼ¶ÉÏÏÞ prioceiling¡£ pthread_mutex_setprioceiling() ¿ÉËø¶¨»¥³âËø£¨Èç¹ûδËø¶¨µÄ»°£©£¬»òÕßÒ»Ö±´¦ÓÚ×èÈû״̬£¬Ö±µ½ pthread_mutex_setprioceiling() ³É¹¦Ëø¶¨¸Ã»¥³âËø£¬¸ü¸Ä¸Ã»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ²¢½«¸Ã»¥³âËøÊÍ·ÅΪֹ¡£Ëø¶¨»¥³âËøµÄ¹ý³ÌÎÞÐè×ñÑÓÅÏȼ¶±£»¤ÐÒé¡£
¡¡¡¡Èç¹û pthread_mutex_setprioceiling() ³É¹¦£¬Ôò½«ÔÚ old_ceiling Öзµ»ØÒÔÇ°µÄÓÅÏȼ¶ÉÏÏÞÖµ¡£Èç¹û pthread_mutex_setprioceiling() ʧ°Ü£¬Ôò»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ±£³Ö²»±ä¡£ pthread_mutex_setprioceiling ·µ»ØÖµ¡¡¡¡Èç¹û³É¹¦Íê³É£¬pthread_mutex_setprioceiling() »á·µ»Ø 0¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÇé¿ö£¬pthread_mutexatt_setprioceiling() ½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö Ñ¡Ïî_POSIX_THREAD_PRIO_PROTECT 䶨Òå²¢ÇÒ¸ÃʵÏÖ²»Ö§³Ö´Ëº¯Êý¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutex_setprioceiling() ¿ÉÄÜ»áʧ°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö prioceiling ËùÇëÇóµÄÓÅÏȼ¶³¬³öÁË·¶Î§¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö mutex Ö¸¶¨µÄÖµ²»»áÒýÓõ±Ç°´æÔڵĻ¥³âËø¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö ¸ÃʵÏÖ²»Ö§³Ö»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞÐÒé¡£
¡¡¡¡EPERM
¡¡¡¡ÃèÊö µ÷Ó÷½ÎÞȨִÐиòÙ×÷¡£
»ñÈ¡»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ¡¡¡¡pthread_mutexattr_getprioceiling(3C) ¿ÉÓÃÀ´»ñÈ¡»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞ¡£ pthread_mutex_getprioceiling Óï·¨¡¡¡¡#include pthread.hint pthread_mutex_getprioceiling(const pthread_mutex_t mutex, int prioceiling);pthread_mutex_getprioceiling() »á·µ»Ø mutex µÄÓÅÏȼ¶ÉÏÏÞ prioceiling¡£ pthread_mutex_getprioceiling ·µ»ØÖµ¡¡¡¡Èç¹û³É¹¦Íê³É£¬pthread_mutex_getprioceiling() »á·µ»Ø 0¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexatt_getprioceiling() ½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö _POSIX_THREAD_PRIO_PROTECT Ñ¡Ïî䶨Òå²¢ÇÒ¸ÃʵÏÖ²»Ö§³Ö´Ëº¯Êý¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutex_getprioceiling() ¿ÉÄÜ»áʧ°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö mutex Ö¸¶¨µÄÖµ²»»áÒýÓõ±Ç°´æÔڵĻ¥³âËø¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö ¸ÃʵÏÖ²»Ö§³Ö»¥³âËøµÄÓÅÏȼ¶ÉÏÏÞÐÒé¡£
¡¡¡¡EPERM
¡¡¡¡ÃèÊö µ÷Ó÷½ÎÞȨִÐиòÙ×÷¡£
ÉèÖû¥³âËøµÄÇ¿½¡ÊôÐÔ¡¡¡¡pthread_mutexattr_setrobust_np(3C) ¿ÉÓÃÀ´ÉèÖû¥³âËøÊôÐÔ¶ÔÏóµÄÇ¿½¡ÊôÐÔ¡£ pthread_mutexattr_setrobust_np Óï·¨¡¡¡¡#include pthread.hint pthread_mutexattr_setrobust_np(pthread_mutexattr_t attr, int robustness);×¢ ¨C
¡¡¡¡½öµ±¶¨ÒåÁË·ûºÅ _POSIX_THREAD_PRIO_INHERIT ʱ£¬pthread_mutexattr_setrobust_np() ²ÅÊÊÓá£
¡¡¡¡attr ָʾÒÔǰͨ¹ýµ÷Óà pthread_mutexattr_init() ´´½¨µÄ»¥³âËøÊôÐÔ¶ÔÏó¡£
¡¡¡¡robustness ¶¨ÒåÔÚ»¥³âËøµÄÊôÖ÷ʧ°ÜʱµÄÐÐΪ¡£pthread.h Öж¨ÒåµÄ robustness µÄֵΪ PTHREAD_MUTEX_ROBUST_NP »ò PTHREAD_MUTEX_STALLED_NP¡£È±Ê¡ÖµÎª PTHREAD_MUTEX_STALLED_NP¡£
¡¡¡¡PTHREAD_MUTEX_ROBUST_NP
¡¡¡¡Èç¹û»¥³âËøµÄÊôÖ÷ʧ°Ü£¬ÔòÒÔºó¶Ô pthread_mutex_lock() µÄËùÓе÷Óý«ÒÔ²»È·¶¨µÄ·½Ê½±»×èÈû¡£
¡¡¡¡PTHREAD_MUTEX_STALLED_NP
¡¡¡¡»¥³âËøµÄÊôÖ÷ʧ°Üʱ£¬½«»á½â³ýËø¶¨¸Ã»¥³âËø¡£»¥³âËøµÄÏÂÒ»¸öÊôÖ÷½«»ñÈ¡¸Ã»¥³âËø£¬²¢·µ»Ø´íÎó EOWNWERDEAD¡£
¡¡¡¡×¢ ¨C Ó¦ÓóÌÐò±ØÐë¼ì²é pthread_mutex_lock() µÄ·µ»Ø´úÂ룬²éÕÒ·µ»Ø´íÎó EOWNWERDEAD µÄ»¥³âËø¡£
¡¡¡¡»¥³âËøµÄÐÂÊôÖ÷Ӧʹ¸Ã»¥³âËøËù±£»¤µÄ״̬±£³ÖÒ»Ö¡£Èç¹ûÉÏÒ»¸öÊôÖ÷ʧ°Ü£¬Ôò»¥³âËø״̬¿ÉÄܻ᲻һÖ¡£
¡¡¡¡Èç¹ûÐÂÊôÖ÷Äܹ»Ê¹×´Ì¬±£³ÖÒ»Ö£¬ÇëÕë¶Ô¸Ã»¥³âËøµ÷Óà pthread_mutex_consistent_np()£¬²¢½â³ýËø¶¨¸Ã»¥³âËø¡£
¡¡¡¡Èç¹ûÐÂÊôÖ÷ÎÞ·¨Ê¹×´Ì¬±£³ÖÒ»Ö£¬ÇëÎðÕë¶Ô¸Ã»¥³âËøµ÷Óà pthread_mutex_consistent_np()£¬¶øÊǽâ³ýËø¶¨¸Ã»¥³âËø¡£
¡¡¡¡ËùÓеȴýµÄÏ̶߳¼½«±»»½ÐÑ£¬ÒÔºó¶Ô pthread_mutex_lock() µÄËùÓе÷Óö¼½«ÎÞ·¨»ñÈ¡¸Ã»¥³âËø¡£·µ»Ø´úÂëΪ ENOTRECOVERABLE¡£Í¨¹ýµ÷Óà pthread_mutex_destroy() È¡Ïû¶Ô»¥³âËøµÄ³õʼ»¯£¬²¢µ÷Óà pthread_mutex_int() ÖØгõʼ»¯¸Ã»¥³âËø£¬¿Éʹ¸Ã»¥³âËø±£³ÖÒ»Ö¡£
¡¡¡¡Èç¹ûÒÑ»ñÈ¡¸ÃËøµÄÏß³Ìʧ°Ü²¢·µ»Ø EOWNERDEAD£¬ÔòÏÂÒ»¸öÊôÖ÷»ñÈ¡¸ÃËøʱ½«·µ»Ø´úÂë EOWNERDEAD¡£ pthread_mutexattr_setrobust_np ·µ»ØÖµ¡¡¡¡Èç¹û³É¹¦Íê³É£¬pthread_mutexattr_setrobust_np() »á·µ»Ø 0¡£ÆäËûÈκηµ»ØÖµ¶¼±íʾ³öÏÖÁË´íÎó¡£
¡¡¡¡Èç¹û³öÏÖÒÔÏÂÈÎÒ»Çé¿ö£¬pthread_mutexattr_setrobust_np() ½«Ê§°Ü²¢·µ»Ø¶ÔÓ¦µÄÖµ¡£
¡¡¡¡ENOSYS
¡¡¡¡ÃèÊö Ñ¡Ïî _POSIX_THREAD_PRIO__INHERIT 䶨Ò壬»òÕ߸ÃʵÏÖ²»Ö§³Ö pthread_mutexattr_setrobust_np()¡£
¡¡¡¡ENOTSUP
¡¡¡¡ÃèÊö robustness Ö¸¶¨µÄÖµ²»ÊÜÖ§³Ö¡£
¡¡¡¡pthread_mutexattr_setrobust_np() ¿ÉÄÜ»áÔÚ³öÏÖÒÔÏÂÇé¿öʱʧ°Ü£º
¡¡¡¡EINVAL
¡¡¡¡ÃèÊö attr »ò robustness Ö¸¶¨µÄÖµÎÞЧ¡£