BBSˮľÇ廪վ¡Ã¾«»ªÇø
·¢ÐÅÈË: Mccartney (coolcat), ÐÅÇø: Unix
±ê Ìâ: Solaris2.4 ¶àÏ̱߳à³ÌÖ¸ÄÏ5--°²È«ºÍ²»°²È«µÄ½Ó¿Úº¯Ê
·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Sun May 17 16:32:40 1998)
5£® °²È«ºÍ²»°²È«µÄ½Ó¿Ú
±¾Õ¶¨ÒåÁ˺¯ÊýºÍ¿âµÄ¶àḬ̈߳²È«µÈ¼¶¡£
Ḭ̈߳²È«
¶àÏ߳̽ӿڰ²È«µÈ¼¶
Òì²½°²È«º¯Êý
¿âµÄ¶àḬ̈߳²È«µÈ¼¶
5.1Ḭ̈߳²È«
Ḭ̈߳²È«ÊÇΪÁ˱ÜÃâÊý¾Ý¾ºÕù--Êý¾ÝÉèÖõÄÕýÈ·ÐÔÒÀÀµÓÚ¶à¸öÏß³ÌÐÞ¸ÄÊý¾Ý
µÄ˳Ðò¡£
Èç¹û²»ÐèÒª¹²Ïí£¬Ôò¸øÃ¿¸öÏ̷߳ÖÅäÒ»¸ö˽ÓеÄÊý¾Ý¿½±´¡£Èç¹ûÊý¾Ý±ØÐë¹²
Ïí£¬Ò»¶¨ÒªÓÃͬ²½»úÖÆÀ´±£Ö¤²Ù×÷µÄΨһÐÔ¡£
Èç¹ûÒ»¸öÏß³ÌÔÚ¼¸¸öÏß³ÌͬʱִÐÐʱÔÚÂß¼ÉÏÊÇÕýÈ·µÄ£¬Ôò³ÆËüΪḬ̈߳²È«
µÄ¡£ÔÚÒ»¸öʵ¼ÊµÄˮƽÉÏ£¬°Ñ°²È«µÈ¼¶»®·ÖΪ3²ã±È½Ï·½±ã¡£
¡¤ ²»°²È«
¡¤ Ḭ̈߳²È«--·Ç²¢ÐÐ
¡¤ Ḭ̈߳²È«--¶àḬ̈߳²È«
Ò»¸ö²»°²È«µÄ¹ý³Ì¿ÉÒÔÓÃÔÚ²Ù×÷ǰ¼Ó»¥³âËø£¬²Ù×÷ºó½â»¥³âËøµÄ°ì·¨À´Ê¹²Ù
×÷ÐòÁл¯£¨¼´Ïû³ý²¢·¢£©¡£Ê¾Àý5-1Ê×ÏÈÏÔʾÁËÒ»¸ö¼ò»¯µÄfputs()µÄ·ÇḬ̈߳²È«
ʵÏÖ¡£
½ÓÏÂÀ´ÊÇÓõ¥»¥³âËø±£»¤Ê¹²Ù×÷ÐòÁл¯µÄ°æ±¾¡£Êµ¼ÊÉÏ£¬Ê¹ÓÃÁ˱ÈÐèÒªµÄ¸ü
Ç¿µÄͬ²½¡£Èç¹ûÁ½¸öÏ̵߳÷ÓÃfputs()À´´òÓ¡µ½²»Í¬µÄÎļþʱ£¬ÆäÖÐÒ»¸öÓò»×Å
µÈ´ýÁíÒ»¸ö--ËüÃÇ¿ÉÒÔͬʱ²Ù×÷¡£
×îºóÒ»¸ö°æ±¾ÊǶàḬ̈߳²È«°æ¡£Ëü¸øÃ¿¸öÎļþ¼ÓÒ»¸öËø£¬ÔÊÐíÁ½¸öÏß³Ìͬʱ
Ö¸Ïò²»Í¬µÄÎļþ¡£ËùÒÔ£¬MT-SAFE(¼´¶àḬ̈߳²È«)µÄº¯ÊýÊÇḬ̈߳²È«µÄ£¬²¢²»»áʹ
ÔËÐÐÐÔÄܱ仵¡£
Code Example 5-1 Ḭ̈߳²È«µÄ³Ì¶È
/*not thread-safe */
fputs(const char *s, FILE *stream){
char *p;
for(p=s; *p; p++)
putc((int)*p,stream);
}
/*serializable*/
fputs(const char *s,FILE *stream){
static mutex_t mut;
char *p;
mutex_lock(&m);
for(p=s;*p;p++)
putc((int)*p,stream);
mutex_unlock(&m);
}
/*MT-SAFE*/
mutex_t m[NFILE];
fputs(const char *s, FILE *stream){
static mutex_t mut;
char *p;
mutex_lock(&m[fileno(stream)]);
for (p=s;*p;p++)
putc((int)*p,stream);
mutex_unlock(&m[fileno(stream)]);
}
5.2¶àÏ߳̽ӿڰ²È«µÈ¼¶
man page(3)£º¿âº¯ÊýÓÃÏÂÃæµÄ·ÖÀàÀ´ÃèÊöÒ»¸ö½Ó¿ÚÖ§³Ö¶àÏ̵߳½Ê²Ã´³Ì¶È
£¨ÕâЩ·ÖÀàÔÚIntro(3) man pageÖнâÊ͵ظüΪÏêϸ£©¡£
Safe ¿ÉÒÔ±»¶àÏß³ÌÓ¦ÓóÌÐòµ÷ÓÃ
Safe with exceptions ÀýÍâµÄ²¿·ÖÇë²Î¼ûNOTES²¿·Ö
Unsafe Õâ¸ö½Ó¿ÚÖ»ÓÐÔÚÓ¦ÓóÌÐò±£Ö¤Ò»¸öʱ¿ÌÖ»ÓÐÒ»¸öÏß³ÌÖ´ÐÐʱ²Å
Äܰ²È«µ÷ÓÃ
MT-Safe ÍêȫΪ¶àÏß³ÌÉè¼Æ£¬²»µ«°²È«£¬»¹Ö§³ÖһЩ²¢·¢ÐÔ
MT-Safe with exceptions ÀýÍâµÄ²¿·ÖÇë²Î¼ûNOTES²¿·Ö
Async-Safe ¿ÉÒÔ±»Ò»¸öÐźſØÖÆÆ÷°²È«µ÷Óá£Ò»¸öÏß³ÌÔÚÖ´ÐÐ
Async-Safeº¯Êýʱ±»ÐźÅÖжϽ«²»»á²úÉúËÀËø¡£
ÓйØsafe½Ó¿ÚÇë¿´¸½Â¼BµÄ±í"MT Safety Levels:Library Interfaces."£¬
ËüÀ´×Ôman pages£¨3£©¡£Èç¹ûÒ»¸öµÚÈý²¿·ÖµÄ½Ó¿Ú²»ÔÚ±íÄÚ£¬Ëü¾ÍÓпÉÄÜÊDz»
°²È«µÄ£¨²»°üÀ¨Ô´¼æÈÝ¿âSource Compatibility Library£©¡£¼ì²éman pageºó²Å
ÄÜÈ·¶¨¡£
ÔÚ"man pages(2)£ºÏµÍ³µ÷ÓÃ"ÖÐÃèÊöµÄËùÓк¯Êý£¬³ýÁËvfork(2)Íâ¶¼ÊÇ
MT-SafeµÄ¡£
һЩº¯ÊýÓÐÒâµØ²»×÷³É°²È«£¬ÒòΪÈçÏÂÔÒò¡£
¶ÔÓÚµ¥Ï̵߳ÄÓ¦ÓóÌÐò£¬MT-Safe»ØÔÚÒ»¶¨³Ì¶ÈÉϽµµÍÐÔÄÜ¡£
º¯Êý±¾ÉíÓÐÒ»¸ö²»°²È«½Ó¿Ú¡£ÀýÈ磬һ¸öº¯Êý»á·µ»ØÒ»¸öÖ¸Ïò¶ÑÕ»»º³åÇø
µÄÖ¸Õë¡£Äã¿ÉÒÔÓÃÕâЩº¯Êý"ÔÙ½øÈë"µÄ¶ÔµÈº¯Êý£¿£¿£¿£¨ÔÎÄΪ
reentrant counterparts£©¡£ÔÙ½øÈ뺯ÊýµÄÃû×ÖÊÇÔº¯Êý¼Ó"_r"ºó׺¡£
-------------------------------------
×¢Òâ--³ý·Çͨ¹ý²éѯÊÖ²áÒ³£¨man pages£©£¬·ñÔòÎÞ·¨È·¶¨Ò»¸ö²»ÒÔ"_r"½áβµÄ
º¯ÊýÊÇ·ñMT-safe¡£·ÇMT-safeµÄº¯ÊýÒ»¶¨ÒªÓÐͬ²½»úÖÆµÄ±£»¤£¬»òÕß±»ÏÞÖÆÔÚ
³õʼÏß³ÌÀï¡£
------------------------------------
*·Ç°²È«½Ó¿ÚµÄÌæ´ú(ÖØÈë Reentrant)º¯Êý
¶ÔÓÚ´ó¶àÊý·Ç°²È«½Ó¿ÚµÄº¯Êý£¬¶¼´æÔÚÒ»¸öMT-safeµÄ°æ±¾¡£ÐµÄMT-safeº¯
ÊýÒ»°ãÊǾɵķǰ²È«º¯Êý¼ÓÉÏ"_r"ºó׺¡£SolarisϵͳÌṩÒÔϵÄ"_r"º¯Êý¡£
Table 5-1 Ìæ´úº¯Êý
asctime_r(3C) ctermid_r(3S) ctime_r(3C)
fgetgrent_r(3C) fgetpwent_r(3C) fgetspent_r(3C)
Gamma_r(3M) getgrgid_r(3C) getgrnam_r(3C)
getlogin_r(3C) getpwnam_r(3C) getpwuid_r(3C)
getgrent_r(3C) gethostbyaddr_r(3N) gethostbyname_r(3N)
gethostent_r(3N) getnetbyaddr_r(3N) getnetbyname_r(3N)
getnetent_r(3N) Getprotobyname_r(3N) getprotobynumber_r(3N)
getprotoent_r(3N) getpwent_r(3C) getrpcbyname_r(3N)
getrpcbynumber_r(3N) getrpcent_r(3N) getservbyname_r(3N)
getservbyport_r(3N) getservent_r(3N) getspent_r(3C)
getspnam_r(3C) gmtime_r(3C) lgamma_r(3M)
localtime_(3C)r nis_sperror_r(3N) rand_r(3C)
readdir_r(3C) strtok_r(3C) tmpnam_r(3C)
ttyname_r(3C)
5.3Òì²½°²È«º¯Êý
¿ÉÒÔ±»ÐźſØÖÆÆ÷°²È«µ÷Óõĺ¯Êý±»³ÆÎªAsync-SafeµÄ¡£POSIX±ê×¼¶¨Òå²¢
ÏêÁÐÁËÒì²½°²È«º¯Êý£¨IEEE Std 1003.1-1990.3.3.1.3(3)(f), page 55£©¡£³ý
ÁËPOSIXÒì²½°²È«º¯ÊýÍ⣬ÏÂÁÐÈý¸öº¯ÊýÒ²ÊÇÒì²½°²È«µÄ¡£
¡¤ sema_post(3T)
¡¤ thr_sigsetmask(3T)
¡¤ thr_kill(3T)
5.4¿âµÄ¶àḬ̈߳²È«µÈ¼¶
ËùÓпÉÄܱ»¶àÏ̳߳ÌÐòµÄÏ̵߳÷Óõĺ¯Êý¶¼Ó¦µ±ÊÇMT-SafeµÄ¡£
ÕâÒâζ׏ý³Ì¿ÉÒÔͬʱÕýÈ·µØÖ´ÐÐÁ½¸ö²Ù×÷¡£ËùÒÔ£¬Ã¿Ò»¸ö±»¶àÏ̳߳ÌÐò
ʹÓõĽӿڶ¼Ó¦ÊÇMT-Safe¡£
²¢²»ÊÇËùÓеĿⶼÊÇMT-SafeµÄ¡£Í¨³£±»Ê¹ÓõÄMT-SafeµÄ¿âÏêÁÐÓÚ±í5-2ÖС£
ÆäËûµÄ¿âÒ²½«×îÖÕ±»¸Äд³ÉMT-SafeµÄ¡£
±í5-2 һЩMT-Safe¿â
------------------------------------
¿â ˵Ã÷
------------------------------------
lib/libc getXXbyYY½Ó¿Ú£¨ÀýÈçgethostbyname(3N)£©ÊÇMT-SafeµÄ
lib/libdl_stubs £¨Ö§³Östatic switch compiling£©
lib/libintl
lib/libm ½öµ±Îª¹²Ïí¿â±àÒëʱÊÇMT-SafeµÄ£¬µ«ÓëÎĵµ¿âÁ¬½Óʱ
²»ÊÇMT-SafeµÄ
lib/libmalloc
lib/libmapmalloc
lib/libnsl °üÀ¨TLI½Ó¿Ú£¬XDR£¬RPC¿Í»§·½ºÍ·þÎñ·½£¬netdirºÍ
netselect¡£ GetXXbyYYÊDz»°²È«µÄ£¬µ«ÓÐḬ̈߳²È«°æ±¾
GetXXbyYY_r
lib/libresolv Ö§³ÖÒòÏ̶߳øÒìµÄ´íÎóÂë
lib/libsocket
lib/libw
lib/nametoaddr
lib/nametoaddr
lib/nsswitch
libX11
libC £¨²»ÊÇSolarisϵͳµÄ²¿·Ö£»¿ÉÒÔ·Ö¿ª¹ºÂò£©
------------------------------------
*²»°²È«¿â
Èç¹û¿âÖеĺ¯Êý²»ÊÇMT-SafeµÄ£¬ÔòÖ»ÓÐÔÚÒ»¸öÏ̵߳ĵ÷ÓÃʱ²ÅÊǰ²È«µÄ¡£
--
¡ù À´Ô´:¡¤BBS ˮľÇ廪վ bbs.net.tsinghua.edu.cn¡¤[FROM: sys11.cic.tsing]
BBSˮľÇ廪վ¡Ã¾«»ªÇø