±à¼ÍƼö: |
±¾ÎÄÖ÷ÒªÁ˽âÒ»ÏÂʲôÊÇḬ̈߳²È«£¬ÔõÑù²ÅÄÜ×öµ½Ḭ̈߳²È«¡£
±¾ÎÄÀ´×ÔÓÚÂëÅ©µÄ»ÄµºÇóÉú£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
´Ó¸ùÔ´ÉÏ˼¿¼
¹ØÓÚÕâ¸öÎÊÌ⣬±¾ÖÊÉÏÊÇÓÐÒ»¸ö´ÊÓïÄãûÓÐ͸³¹Àí½â£¬Õâ¸ö´Ê¾ÍÊÇËùνµÄḬ̈߳²È«£¬thread safe¡£
Èç¹ûÄã²»ÄÜÀí½âḬ̈߳²È«£¬ÄÇô¸øÄãÔÙ¶àµÄ·½°¸Ò²ÊÇÎÞÓÃÎäÖ®µØ¡£
½ÓÏÂÀ´ÎÒÃÇÁ˽âÒ»ÏÂʲôÊÇḬ̈߳²È«£¬ÔõÑù²ÅÄÜ×öµ½Ḭ̈߳²È«¡£
ÕâЩÎÊÌâ½â´ðºó£¬¶àÏß³ÌÕâÍ·´ó¹ÖÊÞ×ÔÈ»¾Í»á±ä³ÉÎÂ˳µÄСèßä¡£

¿ÉÉÏͼ¹ØÐ¡Ã¨ß䯍Ê£¡
¹ØÄãʲôƨÊÂ
Éú»îÖÐÎÒÃÇ¿ÚÍ·ÉϾ³£ËµµÄÒ»¾ä»°¾ÍÊÇ¡°¹ØÄãÆ¨Ê¡±£¬´ó¼ÒÏëÒ»Ï룬ΪʲôÎÒÃÇµÄÆ¨Ê²»¹Ø±ðÈË£¿
ÔÒòºÜ¼òµ¥£¬ÕâÊÇÎÒµÄ˽ʰ¡£¡ÎÒµÄÒ·þ¡¢ÎҵĵçÄÔ£¬ÎÒµÄÊÖ»ú¡¢Îҵijµ×Ó¡¢ÎҵıðÊûÒÔ¼°Ë½ÈËÓ¾³Ø(¿ÉÒÔûÓУ¬µ«²»·Á°ÏëÏó)£¬ÎÒÏëÔõô´¦Àí¾ÍÔõô´¦Àí£¬·Á°²»µ½±ðÈË£¬Ö»ÊôÓÚÎÒÒ»¸öÈ˵Ķ«Î÷ÒÔ¼°ÊÂÇ鵱Ȼ²»¹Ø±ðÈË£¬¼´Ê¹ÊÇÆ¨ÊÂÒ²²»¹Ø±ðÈË¡£

ÎÒÃÇÔÚ×Ô¼º¼ÒÀïÏë³Ôʲô³Ôʲô£¬ÏëÈ¥²ÞËù¾ÍÈ¥²ÞËù£¡ÒòΪÕâЩ¶¼ÊÇÎÒ˽Óеģ¬Ö»ÓÐÎÒ×Ô¼ºÊ¹Óá£
ÄÇôʲôʱºò»áºÍÆäËüÈËÓн»¼¯ÄØ£¿
´ð°¸¾ÍÊǹ«¹²³¡Ëù¡£
ÔÚ¹«¹²³¡ËùÏÂÄã²»ÄÜÏñÔÚ×Ô¼º¼ÒÀïÒ»ÑùÏëÈ¥ÄľÍÈ¥ÄÄ£¬ÏëʲôʱºòÈ¥²ÞËù¾ÍÈ¥²ÞËù£¬ÎªÊ²Ã´ÄØ£¿ÔÒòºÜ¼òµ¥£¬ÒòΪ¹«¹²³¡ËùÏµķ¹¹Ý¡¢ÎÀÉú¼ä²»ÊÇÄã¼ÒµÄ£¬ÕâÊǹ«¹²×ÊÔ´£¬´ó¼Ò¶¼¿ÉÒÔʹÓõĹ«¹²×ÊÔ´¡£
Èç¹ûÄãÏëÈ¥·¹¹Ý¡¢È¥¹«¹²ÎÀÉú¼äÄÇô¾Í±ØÐë×ñÊØ¹æÔò£¬Õâ¸ö¹æÔò¾ÍÊÇÅŶӣ¬Ö»ÓÐǰһ¸öÈËÓÃÍ깫¹²×ÊÔ´ºóÏÂÒ»¸öÈ˲ſÉÒÔʹÓ㬶øÇÒ²»ÄÜͬʱʹÓã¬ÏëʹÓþͱØÐëÅŶӵȴý¡£
ÉÏÃæÕâ¶Î»°µÀÀí×ã¹»¼òµ¥°É¡£
Èç¹ûÄãÄÜÀí½âÕâ¶Î»°£¬ÄÇôѱ·þ¶àÏß³ÌÕâͷС¹ÖÊ޾Ͳ»ÔÚ»°Ï¡£
ά»¤¹«¹²³¡ËùÖÈÐò
Èç¹û°ÑÄã×Ô¼ºÀí½âΪÏ̵߳ϰ£¬ÄÇôÔÚÄã×Ô¼º¼ÒÀïʹÓÃ˽ÓÐ×ÊÔ´¾ÍÊÇËùνµÄḬ̈߳²È«£¬ÔÒòºÜ¼òµ¥£¬ÒòΪÄãËæ±ãÔõôÕÛÌÚ×Ô¼ºµÄ¶«Î÷(×ÊÔ´)¶¼²»»á·Á°µ½±ðÈË£»
µ«µ½¹«¹²³¡ËùÀ˵ϰ¾Í²»Ò»ÑùÁË£¬ÔÚ¹«¹²³¡ËùʹÓõÄÊǹ«¹²×ÊÔ´£¬ÕâʱÄã¾Í²»ÄÜÏñÔÚ×Ô¼º¼ÒÀïÒ»ÑùÏëÔõôÓþÍÔõôÓÃÏëʲôʱºòÓþÍʲôʱºòÓ㬹«¹²³¡Ëù±ØÐëÓÐÏàÓ¦¹æÔò£¬ÕâÀïµÄ¹æÔòͨ³£ÊÇÅŶӣ¬Ö»ÓÐÕâÑù¹«¹²³¡ËùµÄÖÈÐò²Å²»»á±»ÆÆ»µ£¬Ïß³ÌÒÔijÖÖ²»·Á°µ½ÆäËüÏ̵߳ÄÖÈÐòʹÓù²Ïí×ÊÔ´¾ÍÄÜʵÏÖḬ̈߳²È«¡£

Òò´ËÎÒÃÇ¿ÉÒÔ¿´µ½£¬ÕâÀïÓÐÁ½ÖÖÇé¿ö£º
Ïß³Ì˽ÓÐ×ÊÔ´£¬Ã»ÓÐḬ̈߳²È«ÎÊÌâ
¹²Ïí×ÊÔ´£¬Ï̼߳äÒÔijÖÖÖÈÐòʹÓù²Ïí×ÊÔ´Ò²ÄÜʵÏÖḬ̈߳²È«¡£
±¾ÎͼÊÇÎ§ÈÆ×ÅÉÏÊöÁ½¸öºËÐĵãÀ´½²½âµÄ£¬ÏÖÔÚÎÒÃǾͿÉÒÔÕýʽµÄÁÄÁıà³ÌÖеÄḬ̈߳²È«ÁË¡£
ʲôÊÇḬ̈߳²È«
ÎÒÃÇ˵һ¶Î´úÂëÊÇḬ̈߳²È«µÄ£¬µ±ÇÒ½öµ±ÎÒÃÇÔÚ¶à¸öÏß³ÌÖÐͬʱÇÒ¶à´Îµ÷ÓõÄÕâ¶Î´úÂë¶¼Äܸø³öÕýÈ·µÄ½á¹û£¬ÕâÑùµÄ´úÂëÎÒÃDzÅ˵ÊÇḬ̈߳²È«´úÂ룬Thread
Safety£¬·ñÔò¾Í²»ÊÇḬ̈߳²È«´úÂ룬thread-unsafe.¡£
·ÇḬ̈߳²È«µÄ´úÂëÆäÔËÐнá¹ûÊÇÓÉÖÀ÷»×Ó¾ö¶¨µÄ¡£

ÔõôÑù£¬Ḭ̈߳²È«µÄ¶¨ÒåºÜ¼òµ¥°É£¬Ò²¾ÍÊÇ˵ÄãµÄ´úÂë²»¹ÜÊÇÔÚµ¥¸öÏ̻߳¹ÊǶà¸öÏß³ÌÖб»Ö´Ðж¼Ó¦¸ÃÄܸø³öÕýÈ·µÄÔËÐнá¹û£¬ÕâÑùµÄ´úÂëÊDz»»á³öÏÖ¶àÏß³ÌÎÊÌâµÄ£¬¾ÍÏñÏÂÃæÕâ¶Î´úÂ룺
int func() {
int a = 1;
int b = 1;
return a + b;
} |
¶ÔÓÚÕâÑù¶Î´úÂ룬ÎÞÂÛÄãÓöàÉÙÏß³Ìͬʱµ÷Óá¢Ôõôµ÷Óá¢Ê²Ã´Ê±ºòµ÷Óö¼»á·µ»Ø2£¬Õâ¶Î´úÂë¾ÍÊÇḬ̈߳²È«µÄ¡£
ÄÇôÎÒÃǸÃÔõÑùд³öḬ̈߳²È«µÄ´úÂëÄØ£¿
Òª»Ø´ðÕâ¸öÎÊÌ⣬ÎÒÃÇÐèÒªÖªµÀÎÒÃǵĴúÂëʲôʱºò´ôÔÚ×Ô¼º¼ÒÀïʹÓÃ˽ÓÐ×ÊÔ´£¬Ê²Ã´Ê±ºòÈ¥¹«¹²³¡ËùÀËʹÓù«¹²×ÊÔ´£¬Ò²¾ÍÊÇ˵ÄãÐèҪʶ±ðÏ̵߳Ä˽ÓÐ×ÊÔ´ºÍ¹²Ïí×ÊÔ´¶¼ÓÐÄÄЩ£¬ÕâÊǽâ¾öḬ̈߳²È«ÎÊÌâµÄºËÐÄËùÔÚ¡£

Ïß³Ì˽ÓÐ×ÊÔ´
Ï̶߳¼ÓÐÄÄЩ˽ÓÐ×ÊÔ´ÄØ£¿°¡¹þ£¬ÎÒÃÇÔÚÉÏһƪ¡¶Ï̵߳½µ×¹²ÏíÁËÄÄЩ½ø³Ì×ÊÔ´¡·ÖÐÏêϸ½²½âÁËÕâ¸öÎÊÌâ¡£
Ïß³ÌÔËÐеı¾ÖÊÆäʵ¾ÍÊǺ¯ÊýµÄÖ´ÐУ¬º¯ÊýµÄÖ´ÐÐ×Ü»áÓÐÒ»¸öÔ´Í·£¬Õâ¸öÔ´Í·¾ÍÊÇËùνµÄÈë¿Úº¯Êý£¬CPU´ÓÈë¿Úº¯Êý¿ªÊ¼Ö´ÐдӶøÐγÉÒ»¸öÖ´ÐÐÁ÷£¬Ö»²»¹ýÎÒÃÇÈËΪµÄ¸øÖ´ÐÐÁ÷ÆðÒ»¸öÃû×Ö£¬Õâ¸öÃû×־ͽÐÏ̡߳£
¼ÈÈ»Ïß³ÌÔËÐеı¾ÖʾÍÊǺ¯ÊýµÄÖ´ÐУ¬ÄÇôº¯ÊýÔËÐÐʱÐÅÏ¢¶¼±£´æÔÚÄÄÀïÄØ£¿
´ð°¸¾ÍÊÇÕ»Çø£¬Ã¿¸öÏ̶߳¼ÓÐÒ»¸ö˽ÓеÄÕ»Çø£¬Òò´ËÔÚÕ»ÉÏ·ÖÅäµÄ¾Ö²¿±äÁ¿¾ÍÊÇÏß³Ì˽Óеģ¬ÎÞÂÛÎÒÃÇÔõÑùʹÓÃÕâЩ¾Ö²¿±äÁ¿¶¼²»¹ÜÆäËüÏß³ÌÆ¨Ê¡£

Ïß³Ì˽ÓеÄÕ»Çø¾ÍÊÇÏß³Ì×Ô¼º¼Ò¡£
Ï̼߳乲ÏíÊý¾Ý
³ýÁËÉÏÒ»½ÚÌáµ½µÄʣϵÄÇøÓò¾ÍÊǹ«¹²³¡ºÏÁË£¬Õâ°üÀ¨£º
ÓÃÓÚ¶¯Ì¬·ÖÅäÄÚ´æµÄ¶ÑÇø£¬ÎÒÃÇÓÃC/C++ÖеÄmalloc»òÕßnew¾ÍÊÇÔÚ¶ÑÇøÉÏÉêÇëµÄÄÚ´æ
È«¾ÖÇø£¬ÕâÀï´æ·ÅµÄ¾ÍÊÇÈ«¾Ö±äÁ¿
Îļþ£¬ÎÒÃÇÖªµÀÏß³ÌÊǹ²Ïí½ø³Ì´ò¿ªµÄÎļþ

ÓеÄͬѧ¿ÉÄÜ˵£¬µÈµÈ£¬ÔÚÉÏһƪÎÄÕ²»ÊÇ˵»¹ÓдúÂëÇøºÍ¶¯Ì¬Á´½Ó¿âÂð£¿
ÒªÖªµÀÕâÁ½¸öÇøÓòÊDz»Äܱ»Ð޸ĵģ¬Ò²¾ÍÊÇ˵ÕâÁ½¸öÇøÓòÊÇÖ»¶ÁµÄ£¬Òò´Ë¶à¸öÏß³ÌʹÓÃÊÇûÓÐÎÊÌâµÄ¡£
ÔÚ¸Õ²ÅÎÒÃÇÌáµ½µÄ¶ÑÇø¡¢Êý¾ÝÇøÒÔ¼°Îļþ£¬ÕâЩ¾ÍÊÇËùÓеÄÏ̶߳¼¿ÉÒÔ¹²ÏíµÄ×ÊÔ´£¬Ò²¾ÍÊǹ«¹²³¡Ëù£¬Ïß³ÌÔÚÕâЩ¹«¹²³¡Ëù¾Í²»ÄÜËæ±ãÀËÁË¡£
Ïß³ÌʹÓÃÕâЩ¹²Ïí×ÊÔ´±ØÐëÒª×ñÊØÖÈÐò£¬Õâ¸öÖÈÐòµÄºËÐľÍÊǶԹ²Ïí×ÊÔ´µÄʹÓò»ÄÜ·Á°µ½ÆäËüỊ̈߳¬ÎÞÂÛÄãʹÓø÷ÖÖËøÒ²ºÃ¡¢ÐźÅÁ¿Ò²°Õ£¬ÆäÄ¿µÄ¶¼ÊÇÔÚά»¤¹«¹²³¡ËùµÄÖÈÐò¡£
ÖªµÀÁËÄÄЩÊÇÏß³Ì˽Óеģ¬ÄÄЩÊÇÏ̼߳乲ÏíµÄ£¬½ÓÏÂÀ´¾Í¼òµ¥ÁË¡£
ÖµµÃ×¢ÒâµÄÊÇ£¬¹ØÓÚḬ̈߳²È«µÄÒ»ÇÐÎÊÌâÈ«²¿Î§ÈÆ×ÅÏß³Ì˽ÓÐÊý¾ÝÓëÏ̹߳²ÏíÊý¾ÝÀ´´¦Àí£¬×¥×¡ÁËÏß³Ì˽ÓÐ×ÊÔ´ºÍ¹²Ïí×ÊÔ´Õâ¸öÖ÷Ҫì¶ÜÒ²¾ÍץסÁ˽â¾öḬ̈߳²È«ÎÊÌâµÄºËÐÄ¡£
½ÓÏÂÀ´ÎÒÃÇ¿´ÏÂÔÚ¸÷ÖÖÇé¿öϸÃÔõÑùʵÏÖḬ̈߳²È«£¬ÒÀÈ»ÒÔC/C++´úÂëΪÀý£¬µ«ÊÇÕâÀï½²½âµÄ·½·¨ÊÊÓÃÓÚÈκÎÓïÑÔ£¬Çë·ÅÐÄ£¬ÕâЩ´úÂë×ã¹»¼òµ¥¡£
ֻʹÓÃÏß³Ì˽ÓÐ×ÊÔ´
ÎÒÃÇÀ´¿´Õâ¶Î´úÂ룺
int func() {
int a = 1;
int b = 1;
return a + b;
} |
Õâ¶Î´úÂëÔÚÇ°ÃæÌáµ½¹ý£¬ÎÞÂÛÄãÔÚ¶àÉÙ¸öÏß³ÌÖÐÔõôµ÷ÓÃʲôʱºòµ÷Óã¬funcº¯Êý¶¼»áÈ·¶¨µÄ·µ»Ø2£¬¸Ãº¯Êý²»ÒÀÀµÈκÎÈ«¾Ö±äÁ¿£¬²»ÒÀÀµÈκκ¯Êý²ÎÊý£¬ÇÒʹÓõľֲ¿±äÁ¿¶¼ÊÇÏß³Ì˽ÓÐ×ÊÔ´£¬ÕâÑùµÄ´úÂëÒ²±»³ÆÎªÎÞ״̬º¯Êý£¬stateless£¬ºÜÏÔÈ»ÕâÑùµÄ´úÂëÊÇḬ̈߳²È«µÄ¡£

ÕâÑùµÄ´úÂëÇë·ÅÐĴ󵨵ÄÔÚ¶àÏß³ÌÖÐʹÓ㬲»»áÓÐÈκÎÎÊÌâ¡£
ÓеÄͬѧ¿ÉÄÜ»á˵£¬ÄÇÈç¹ûÎÒÃÇ»¹ÊÇʹÓÃÏß³Ì˽ÓÐ×ÊÔ´£¬µ«ÊÇ´«È뺯Êý²ÎÊýÄØ£¿
Ïß³Ì˽ÓÐ×ÊÔ´+º¯Êý²ÎÊý
ÕâÑùµÄ´úÂëÊÇḬ̈߳²È«µÄÂð£¿×Ô¼ºÏÈÏëÒ»ÏëÕâ¸öÎÊÌâ¡£
´ð°¸ÊÇit depends£¬Ò²¾ÍÊÇÒª¿´Çé¿ö¡£¿´Ê²Ã´Çé¿öÄØ£¿
1£¬°´Öµ´«²Î
Èç¹ûÄã´«ÈëµÄ²ÎÊýµÄ·½Ê½Êǰ´Öµ´«È룬ÄÇôûÓÐÎÊÌ⣬´úÂëÒÀÈ»ÊÇḬ̈߳²È«µÄ£º
int func(int num) {
num++;
return num;
} |
ÕâÕâ¶Î´úÂëÎÞÂÛÔÚ¶àÉÙ¸öÏß³ÌÖе÷ÓÃÔõôµ÷ÓÃʲôʱºòµ÷Óö¼»áÕýÈ··µ»Ø²ÎÊý¼Ó1ºóµÄÖµ¡£
ÔÒòºÜ¼òµ¥£¬°´Öµ´«ÈëµÄÕâЩ²ÎÊýÊÇÏß³Ì˽ÓÐ×ÊÔ´¡£

2£¬°´ÒýÓô«²Î
µ«Èç¹ûÊǰ´ÒýÓô«Èë²ÎÊý£¬ÄÇôÇé¿ö¾Í²»Ò»ÑùÁË£º
int func(int* num) {
++(*num);
return *num;
} |
Èç¹ûµ÷Óøú¯ÊýµÄÏ̴߳«ÈëµÄ²ÎÊýÊÇÏß³Ì˽ÓÐ×ÊÔ´£¬ÄÇô¸Ãº¯ÊýÒÀÈ»ÊÇḬ̈߳²È«µÄ£¬ÄÜÕýÈ·µÄ·µ»Ø²ÎÊý¼Ó1ºóµÄÖµ¡£
µ«Èç¹û´«ÈëµÄ²ÎÊýÊÇÈ«¾Ö±äÁ¿£¬¾ÍÏñÕâÑù£º
int global_num = 1;
int func(int* num) {
++(*num);
return *num;
} // Ïß³Ì1
void thread1() {
func(&global_num);
} // Ïß³Ì2
void thread1() {
func(&global_num);
} |
ÄÇ´Ëʱfuncº¯Êý½«²»ÔÙÊÇḬ̈߳²È«´úÂ룬ÒòΪ´«ÈëµÄ²ÎÊýÖ¸ÏòÁËÈ«¾Ö±äÁ¿£¬Õâ¸öÈ«¾Ö±äÁ¿ÊÇËùÓÐÏ߳̿ɹ²Ïí×ÊÔ´£¬ÕâÖÖÇé¿öÏÂÈç¹û²»¸Ä±äÈ«¾Ö±äÁ¿µÄʹÓ÷½Ê½£¬ÄÇô¶Ô¸ÃÈ«¾Ö±äÁ¿µÄ¼Ó1²Ù×÷±ØÐëÊ©¼ÓijÖÖÖÈÐò£¬±ÈÈç¼ÓËø¡£

ÓеÄͬѧ¿ÉÄÜ»á˵Èç¹ûÎÒ´«ÈëµÄ²»ÊÇÈ«¾Ö±äÁ¿µÄÖ¸Õë(ÒýÓÃ)ÊDz»ÊǾͲ»»áÓÐÎÊÌâÁË£¿
´ð°¸ÒÀÈ»ÊÇit depends£¬Òª¿´Çé¿ö¡£
¼´±ãÎÒÃÇ´«ÈëµÄ²ÎÊýÊÇÔÚ¶ÑÉÏ(heap)ÓÃmalloc»ònew³öÀ´µÄ£¬ÒÀÈ»¿ÉÄÜ»áÓÐÎÊÌ⣬Ϊʲô£¿
´ð°¸ºÜ¼òµ¥£¬ÒòΪ¶ÑÉϵÄ×ÊÔ´Ò²ÊÇËùÓÐÏ߳̿ɹ²ÏíµÄ¡£

¼ÙÈçÓÐÁ½¸öÏ̵߳÷ÓÃfuncº¯Êýʱ´«ÈëµÄÖ¸Õë(ÒýÓÃ)Ö¸ÏòÁËͬһ¸ö¶ÑÉϵıäÁ¿£¬ÄÇô¸Ã±äÁ¿¾Í±ä³ÉÁËÕâÁ½¸öÏ̵߳Ĺ²Ïí×ÊÔ´£¬ÔÚÕâÖÖÇé¿öÏÂfuncº¯ÊýÒÀÈ»²»ÊÇḬ̈߳²È«µÄ¡£
¸Ä½øÒ²ºÜ¼òµ¥£¬ÄǾÍÊÇÿ¸öÏ̵߳÷ÓÃfuncº¯Êý´«ÈëÒ»¸ö¶ÀÊôÓÚ¸ÃÏ̵߳Ä×ÊÔ´µØÖ·£¬ÕâÑù¸÷¸öÏ߳̾Ͳ»»á·Á°µ½¶Ô·½ÁË£¬Òò´Ë£¬Ð´³öḬ̈߳²È«´úÂëµÄÒ»´óÔÔò¾ÍÊÇÄÜÓÃÏß³Ì˽ÓеÄ×ÊÔ´¾ÍÓÃ˽ÓÐ×ÊÔ´£¬Ïß³ÌÖ®¼ä¾¡×î´ó¿ÉÄܲ»È¥Ê¹Óù²Ïí×ÊÔ´¡£
Èç¹ûÏ̲߳»µÃÒÑҪʹÓÃÈ«¾Ö×ÊÔ´ÄØ£¿
ʹÓÃÈ«¾Ö×ÊÔ´
ʹÓÃÈ«¾Ö×ÊÔ´¾ÍÒ»¶¨²»ÊÇḬ̈߳²È«´úÂëÂð£¿
´ð°¸»¹ÊÇ¡£¡£ÓеÄͬѧ¿ÉÄÜÒѾ²Âµ½ÁË£¬´ð°¸ÒÀÈ»ÊÇÒª¿´Çé¿ö¡£
Èç¹ûʹÓõÄÈ«¾Ö×ÊÔ´Ö»ÔÚ³ÌÐòÔËÐÐʱ³õʼ»¯Ò»´Î£¬´ËºóËùÓдúÂë¶ÔÆäʹÓö¼ÊÇÖ»¶ÁµÄ£¬ÄÇôûÓÐÎÊÌ⣬¾ÍÏñÕâÑù£º
int global_num
= 100; //³õʼ»¯Ò»´Î£¬´ËºóûÓÐÆäËü´úÂëÐÞ¸ÄÆäÖµ
int func() {
return global_num;
} |
ÎÒÃÇ¿´µ½£¬¼´Ê¹funcº¯ÊýʹÓÃÁËÈ«¾Ö±äÁ¿£¬µ«¸ÃÈ«¾Ö±äÁ¿Ö»ÔÚÔËÐÐǰ³õʼ»¯Ò»´Î£¬´ËºóµÄ´úÂë¶¼²»»á¶ÔÆä½øÐÐÐ޸ģ¬ÄÇôfuncº¯ÊýÒÀÈ»ÊÇḬ̈߳²È«µÄ¡£

µ«£¬Èç¹ûÎÒÃǼòµ¥ÐÞ¸ÄÒ»ÏÂfunc£º
int global_num = 100;
int func() {
++global_num;
return global_num;
} |
Õâʱ£¬funcº¯Êý¾Í²»ÔÙÊÇḬ̈߳²È«µÄÁË£¬¶ÔÈ«¾Ö±äÁ¿µÄÐ޸ıØÐë¼ÓËø±£»¤¡£
Ïֲ߳̾¿´æ´¢
½ÓÏÂÀ´ÎÒÃÇÔÙ¶ÔÉÏÊöfuncº¯Êý¼òµ¥Ð޸ģº
__thread int global_num = 100;
int func() {
++global_num;
return global_num;
} |
ÎÒÃÇ¿´µ½È«¾Ö±äÁ¿global_numǰ¼ÓÁ˹ؼü´Ê__threadÐÞÊΣ¬Õâʱ£¬func´úÂë¾ÍÊÇÓÖÊÇḬ̈߳²È«µÄÁË¡£
ÎªÊ²Ã´ÄØ£¿
ÆäʵÔÚÉÏһƪÎÄÕÂÖÐÎÒÃǽ²¹ý£¬±»__thread¹Ø¼ü´ÊÐÞÊιýµÄ±äÁ¿·ÅÔÚÁËÏß³Ì˽Óд洢ÖУ¬Thread
Local Storage£¬Ê²Ã´ÒâË¼ÄØ£¿
Òâ˼ÊÇ˵Õâ¸ö±äÁ¿ÊÇÏß³Ì˽ÓеÄÈ«¾Ö±äÁ¿£º
global_numÊÇÈ«¾Ö±äÁ¿
global_numÊÇÏß³Ì˽ÓеÄ

¸÷¸öÏ̶߳Ôglobal_numµÄÐ޸IJ»»áÓ°Ïìµ½ÆäËüỊ̈߳¬ÒòΪÊÇÏß³Ì˽ÓÐ×ÊÔ´£¬Òò´Ëfuncº¯ÊýÊÇḬ̈߳²È«µÄ¡£
˵ÍêÁ˾ֲ¿±äÁ¿¡¢È«¾Ö±äÁ¿¡¢º¯Êý²ÎÊý£¬ÄÇô½ÓÏÂÀ´¾Íµ½º¯Êý·µ»ØÖµÁË¡£
º¯Êý·µ»ØÖµ
ÕâÀïÒ²ÓÐÁ½ÖÖÇé¿ö£¬Ò»ÖÖÊǺ¯Êý·µ»ØµÄÊÇÖµ£»ÁíÒ»ÖÖ·µ»Ø¶Ô±äÁ¿µÄÒýÓá£
1£¬·µ»ØµÄÊÇÖµ
ÎÒÃÇÀ´¿´ÕâÑùÒ»¶Î´úÂ룺
int func() {
int a = 100;
return a;
}
|
ºÁÎÞÒÉÎÊ£¬Õâ¶Î´úÂëÊÇḬ̈߳²È«µÄ£¬ÎÞÂÛÎÒÃÇÔõÑùµ÷Óøú¯Êý¶¼»á·µ»ØÈ·¶¨µÄÖµ100¡£
2£¬·µ»ØµÄÊÇÒýÓÃ
ÎÒÃǰÑÉÏÊö´úÂë¼òµ¥µÄ¸ÄÒ»¸Ä£º
int* func() {
static int a = 100;
return &a;
} |
Èç¹ûÎÒÃÇÔÚ¶àÏß³ÌÖе÷ÓÃÕâÑùµÄº¯Êý£¬ÄÇô½ÓÏÂÀ´µÈ×ÅÄãµÄ¿ÉÄܾÍÊÇÄÑÒÔµ÷ÊÔµÄbugÒÔ¼°ÂþÂþµÄ¼Ó°à³¤Ò¹¡£¡£

ºÜÏÔÈ»£¬Õâ²»ÊÇḬ̈߳²È«´úÂ룬²úÉúbugµÄÔÒòÒ²ºÜ¼òµ¥£¬ÄãÔÚʹÓøñäÁ¿Ç°ÆäÖµ¿ÉÄÜÒѾ±»ÆäËüÏß³ÌÐÞ¸ÄÁË¡£ÒòΪ¸Ãº¯ÊýʹÓÃÁËÒ»¸ö¾²Ì¬È«¾Ö±äÁ¿£¬Ö»ÒªÄÜÄõ½¸Ã±äÁ¿µÄµØÖ·ÄÇôËùÓÐÏ̶߳¼¿ÉÒÔÐ޸ĸñäÁ¿µÄÖµ£¬ÒòΪÕâÊÇÏ̼߳äµÄ¹²Ïí×ÊÔ´£¬²»µ½Íò²»µÃÒѲ»ÒªÐ´³öÉÏÊö´úÂ룬³ý·ÇÀϰåÄõ¶¼ÜÔÚÄã²±×ÓÉÏ¡£
µ«ÊÇ£¬Çë×¢Ò⣬ÓÐÒ»¸öÌØÀý£¬ÕâÖÖʹÓ÷½·¨¿ÉÒÔÓÃÀ´ÊµÏÖÉè¼ÆÄ£Ê½Öеĵ¥Àýģʽ£¬¾ÍÏñÕâÑù£º
class S {
public:
static S& getInstance() {
static S instance;
return instance;
}
private:
S() {}
// ÆäËüÊ¡ÂÔ
} |
ÎªÊ²Ã´ÄØ£¿
ÒòΪÎÞÂÛÎÒÃǵ÷ÓöàÉÙ´Îfuncº¯Êý£¬static¾Ö²¿±äÁ¿¶¼Ö»»á±»³õʼ»¯Ò»´Î£¬ÕâÖÖÌØÐÔ¿ÉÒԺܷ½±ãµÄÈÃÎÒÃÇʵÏÖµ¥Àýģʽ¡£
×îºóÈÃÎÒÃÇÀ´¿´ÏÂÕâÖÖÇé¿ö£¬ÄǾÍÊÇÈç¹ûÎÒÃǵ÷ÓÃÒ»¸ö·ÇḬ̈߳²È«µÄº¯Êý£¬ÄÇôÎÒÃǵĺ¯ÊýÊÇḬ̈߳²È«µÄÂð£¿
µ÷Ó÷ÇḬ̈߳²È«´úÂë
¼ÙÈçÒ»¸öº¯ÊýAµ÷ÓÃÁíÒ»¸öº¯ÊýB£¬µ«B²»ÊÇḬ̈߳²È«£¬ÄÇôº¯ÊýAÊÇḬ̈߳²È«µÄÂð£¿
´ð°¸ÒÀÈ»ÊÇ£¬Òª¿´Çé¿ö¡£
ÎÒÃÇ¿´ÏÂÕâÑùÒ»¶Î´úÂ룬Õâ¶Î´úÂëÔÚ֮ǰ½²½â¹ý£º
int global_num = 0;
int func() {
++global_num;
return global_num;
} |
ÎÒÃÇÈÏΪfuncº¯ÊýÊÇ·ÇḬ̈߳²È«µÄ£¬ÒòΪfuncº¯ÊýʹÓÃÁËÈ«¾Ö±äÁ¿²¢¶ÔÆä½øÐÐÁËÐ޸쬵«Èç¹ûÎÒÃÇÕâÑùµ÷ÓÃfuncº¯Êý£º
int funcA() {
mutex l;
l.lock();
func();
l.unlock();
}
|
ËäÈ»funcº¯ÊýÊÇ·ÇḬ̈߳²È«µÄ£¬µ«ÊÇÎÒÃÇÔÚµ÷Óøú¯Êýǰ¼ÓÁËÒ»°ÑËø½øÐб£»¤£¬ÄÇôÕâʱfuncAº¯Êý¾ÍÊÇḬ̈߳²È«µÄÁË£¬Æä±¾ÖʾÍÊÇÎÒÃÇÓÃÒ»°ÑËø¼ä½ÓµÄ±£»¤ÁËÈ«¾Ö±äÁ¿¡£
ÔÙ¿´ÕâÑùÒ»¶Î´úÂ룺
int func(int
*num) {
++(*num);
return *num;
}
|
Ò»°ãÎÒÃÇÈÏΪfuncº¯ÊýÊÇ·ÇḬ̈߳²È«µÄ£¬ÒòΪÎÒÃDz»ÖªµÀ´«ÈëµÄÖ¸ÕëÊDz»ÊÇÖ¸ÏòÁËÒ»¸öÈ«¾Ö±äÁ¿£¬µ«Èç¹ûµ÷ÓÃfuncº¯ÊýµÄ´úÂëÊÇÕâÑùµÄ£º
void funcA() {
int a = 100;
func(&a);
}
|
ÄÇôÕâʱfuncAº¯ÊýÒÀÈ»ÊÇḬ̈߳²È«µÄ£¬ÒòΪ´«ÈëµÄ²ÎÊýÊÇÏß³Ì˽Óеľֲ¿±äÁ¿£¬ÎÞÂÛ¶àÉÙÏ̵߳÷ÓÃfuncA¶¼²»»á¸ÉÈŵ½ÆäËüÏ̡߳£
¿´Á˸÷ÖÖÇé¿öϵÄḬ̈߳²È«ÎÊÌ⣬×îºóÈÃÎÒÃÇÀ´×ܽáÒ»ÏÂʵÏÖḬ̈߳²È«´úÂë¶¼ÓÐÄÄЩ´ëÊ©¡£
ÈçºÎʵÏÖḬ̈߳²È«
´ÓÉÏÃæ¸÷ÖÖÇé¿öµÄ·ÖÎöÀ´¿´£¬ÊµÏÖḬ̈߳²È«ÎÞÍâºõÎ§ÈÆÏß³Ì˽ÓÐ×ÊÔ´ºÍÏ̹߳²Ïí×ÊÔ´ÕâÁ½µã£¬ÄãÐèҪʶ±ð³öÄÄЩÊÇÏß³Ì˽ÓУ¬ÄÄЩÊǹ²ÏíµÄ£¬ÕâÊǺËÐÄ£¬È»ºó¶ÔÖ¢ÏÂÒ©¾Í¿ÉÒÔÁË¡£
²»Ê¹ÓÃÈκÎÈ«¾Ö×ÊÔ´£¬Ö»Ê¹ÓÃÏß³Ì˽ÓÐ×ÊÔ´£¬ÕâÖÖͨ³£±»³ÆÎªÎÞ״̬´úÂë
Ïֲ߳̾¿´æ´¢£¬Èç¹ûҪʹÓÃÈ«¾Ö×ÊÔ´£¬ÊÇ·ñ¿ÉÒÔÉùÃ÷ΪÏֲ߳̾¿´æ´¢£¬ÒòΪÕâÖÖ±äÁ¿ËäÈ»ÊÇÈ«¾ÖµÄ£¬µ«Ã¿¸öÏ̶߳¼ÓÐÒ»¸öÊôÓÚ×Ô¼ºµÄ¸±±¾£¬¶ÔÆäÐ޸IJ»»áÓ°Ïìµ½ÆäËüÏß³Ì
Ö»¶Á£¬Èç¹û±ØÐëʹÓÃÈ«¾Ö×ÊÔ´£¬ÄÇôȫ¾Ö×ÊÔ´ÊÇ·ñ¿ÉÒÔÊÇÖ»¶ÁµÄ£¬¶àÏß³ÌʹÓÃÖ»¶ÁµÄÈ«¾Ö×ÊÔ´²»»áÓÐḬ̈߳²È«ÎÊÌâ¡£
Ô×Ó²Ù×÷£¬Ô×Ó²Ù×÷ÊÇ˵ÆäÔÚÖ´Ðйý³ÌÖÐÊDz»¿ÉÄܱ»ÆäËüÏ̴߳ò¶ÏµÄ£¬ÏñC++ÖеÄstd::atomicÐÞÊιýµÄ±äÁ¿£¬¶ÔÕâÀà±äÁ¿µÄ²Ù×÷ÎÞÐ贫ͳµÄ¼ÓËø±£»¤£¬ÒòΪC++»áÈ·±£ÔÚ±äÁ¿µÄÐ޸Ĺý³ÌÖв»»á±»´ò¶Ï¡£ÎÒÃdz£ËµµÄ¸÷ÖÖÎÞËøÊý¾Ý½á¹¹Í¨³£ÊÇÔÚÕâÀàÔ×Ó²Ù×÷µÄ»ù´¡ÉϹ¹½¨µÄ
¡£
ͬ²½»¥³â£¬µ½ÕâÀïÒ²¾ÍÈ·¶¨ÁËÄã±ØÐëÒªÒÔijÖÖÐÎʽʹÓÃÈ«¾Ö×ÊÔ´£¬ÄÇôÔÚÕâÖÖÇé¿öϹ«¹²³¡ËùµÄÖÈÐò±ØÐëµÃµ½Î¬»¤£¬ÄÇôÔõôά»¤ÄØ£¿Í¨¹ýͬ²½»òÕß»¥³âµÄ·½Ê½£¬ÕâÊÇÒ»´óÀàÎÊÌ⣬ÎÒÃǽ«ÔÚ¡¶ÉîÈëÀí½â²Ù×÷ϵͳ¡·ÏµÁÐÎÄÕÂÖÐÏêϸ²ûÊöÕâÒ»ÎÊÌâ¡£
×ܽá
ÔõôÑù£¬Ïëд³öḬ̈߳²È«µÄ»¹ÊDz»¼òµ¥µÄ°É£¬Èç¹û±¾ÎÄÄãÖ»ÄܼÇסһ¾ä»°µÄ»°£¬ÄÇôÎÒÏ£ÍûÊÇÕâ¾ä£¬ÕâÒ²ÊDZ¾ÎĵĺËÐÄ£º
ʵÏÖḬ̈߳²È«ÎÞÍâºõÎ§ÈÆÏß³Ì˽ÓÐ×ÊÔ´ºÍÏ̹߳²Ïí×ÊÔ´À´½øÐУ¬ÄãÐèҪʶ±ð³öÄÄЩÊÇÏß³Ì˽ÓУ¬ÄÄЩÊǹ²ÏíµÄ£¬È»ºó¶ÔÖ¢ÏÂÒ©¾Í¿ÉÒÔÁË¡£
Ï£Íû±¾ÎĶԴó¼Ò±àд¶àÏ̳߳ÌÐòÓаïÖú¡£
|