锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品对白刺激久久久,久久精品国产清自在天天线,伊人久久亚洲综合影院 http://www.shnenglu.com/ccl0326/archive/2010/12/16/136635.htmlVincent Vincent Thu, 16 Dec 2010 06:37:00 GMT http://www.shnenglu.com/ccl0326/archive/2010/12/16/136635.html http://www.shnenglu.com/ccl0326/comments/136635.html http://www.shnenglu.com/ccl0326/archive/2010/12/16/136635.html#Feedback 0 http://www.shnenglu.com/ccl0326/comments/commentRss/136635.html http://www.shnenglu.com/ccl0326/services/trackbacks/136635.html 涓. 鍦ㄤ富綰跨▼涓皟鐢?br>(1)pthread_create( &thread_a, NULL, thread_function, NULL); (2)pthread_create( &thread_b, NULL, thread_function, NULL); (3)pthread_create( &thread_c, NULL, thread_function, NULL);
鍦ㄦ2澶勶紝綰跨▼b鍙互璁や負綰跨▼a宸茬粡瀛樺湪 浣嗘槸鍦ㄦ2鎵ц瀹屼互鍚庯紝涓葷嚎紼嬪茍涓嶇煡閬撶嚎紼媋鍜岀嚎紼媌璋佸厛鎵ц錛屽茍涓嶈兘鍦ㄨ繖閲屽仛綰跨▼a鍏堜簬綰跨▼b鎵ц鐨勫亣璁?br>鍥犱負綰跨▼鐨勬椂闂寸墖鍒嗛厤鍦ㄨ繖閲屾槸鏈煡鐨?/p>
浜? myglobal=myglobal+1; myglobal鏄叏灞鍙橀噺,澶氫釜綰跨▼鍚屾椂鍦ㄥ仛绱姞鐨勫伐浣?br>鏄惁搴旇涓簃yglobal=myglobal+1;鍔犻攣鍛紵 鑲畾鏄簲璇ュ姞閿?br>棣栧厛鎴戜滑騫朵笉鐭ラ亾myglobal=myglobal+1;鍙堟垨鏄?+ myglobal;鑳藉惁琚紪璇戞垚涓鏉℃眹緙栨寚浠?br>灝辯畻濡傛++ myglobal琚紪璇戞垚浜嗗師瀛愭搷浣?br>浣嗚冭檻鍒板鏍稿鐞嗗櫒錛屽叾鍘熷瓙鎿嶄綔鍙兘鍦ㄥCPU涓婂悓鏃跺鐞?br>鍏剁粨鏋滀粛鐒舵槸涓嶅彲棰勪及鐨?/p>
浠ヤ笂鍐呭杞堪鑷猦ttp://www.ibm.com/developerworks/cn/linux/thread/posix_thread2/index.html
]]>銆愯漿銆戠嚎紼嬪悓姝?鑷棆閿佷笌Mutex/淇″彿閲忕殑鍖哄埆鍜岃仈緋?/title> http://www.shnenglu.com/ccl0326/archive/2010/09/21/127247.htmlVincent Vincent Tue, 21 Sep 2010 07:15:00 GMT http://www.shnenglu.com/ccl0326/archive/2010/09/21/127247.html http://www.shnenglu.com/ccl0326/comments/127247.html http://www.shnenglu.com/ccl0326/archive/2010/09/21/127247.html#Feedback 0 http://www.shnenglu.com/ccl0326/comments/commentRss/127247.html http://www.shnenglu.com/ccl0326/services/trackbacks/127247.html Pthreads鎻愪緵浜嗗縐嶉攣鏈哄埗錛?br>(1) Mutex錛堜簰鏂ラ噺錛夛細pthread_mutex_*** (2) Spin lock錛堣嚜鏃嬮攣錛夛細pthread_spin_*** (3) Condition Variable錛堟潯浠跺彉閲忥級錛歱thread_con_*** (4) Read/Write lock錛堣鍐欓攣錛夛細pthread_rwlock_*** Pthreads鎻愪緵鐨凪utex閿佹搷浣滅浉鍏崇殑API涓昏鏈夛細 pthread_mutex_lock (pthread_mutex_t *mutex); pthread_mutex_trylock (pthread_mutex_t *mutex); pthread_mutex_unlock (pthread_mutex_t *mutex); Pthreads鎻愪緵鐨勪笌Spin Lock閿佹搷浣滅浉鍏崇殑API涓昏鏈夛細 pthread_spin_lock (pthread_spinlock_t *lock); pthread_spin_trylock (pthread_spinlock_t *lock); pthread_spin_unlock (pthread_spinlock_t *lock); 浠庡疄鐜板師鐞嗕笂鏉ヨ錛孧utex灞炰簬sleep-waiting綾誨瀷鐨勯攣銆備緥濡傚湪涓涓弻鏍哥殑鏈哄櫒涓婃湁涓や釜綰跨▼(綰跨▼A鍜岀嚎紼婤)錛屽畠浠垎鍒繍琛屽湪Core0鍜孋ore1涓娿傚亣璁劇嚎紼婣鎯寵閫氳繃pthread_mutex_lock鎿嶄綔鍘誨緱鍒頒竴涓復鐣屽尯鐨勯攣錛岃屾鏃惰繖涓攣姝h綰跨▼B鎵鎸佹湁錛岄偅涔堢嚎紼婣灝變細琚樆濉?blocking)錛孋ore0 浼氬湪姝ゆ椂榪涜涓婁笅鏂囧垏鎹?Context Switch)灝嗙嚎紼婣緗簬絳夊緟闃熷垪涓紝姝ゆ椂Core0灝卞彲浠ヨ繍琛屽叾浠栫殑浠誨姟(渚嬪鍙︿竴涓嚎紼婥)鑰屼笉蹇呰繘琛屽繖絳夊緟銆傝孲pin lock鍒欎笉鐒訛紝瀹冨睘浜巄usy-waiting綾誨瀷鐨勯攣錛屽鏋滅嚎紼婣鏄嬌鐢╬thread_spin_lock鎿嶄綔鍘昏姹傞攣錛岄偅涔堢嚎紼婣灝變細涓鐩村湪 Core0涓婅繘琛屽繖絳夊緟騫朵笉鍋滅殑榪涜閿佽姹傦紝鐩村埌寰楀埌榪欎釜閿佷負姝€?br> 濡傛灉澶у鍘繪煡闃匧inux glibc涓pthreads API鐨勫疄鐜癗PTL(Native POSIX Thread Library) 鐨勬簮鐮佺殑璇?浣跨敤”getconf GNU_LIBPTHREAD_VERSION”鍛戒護鍙互寰楀埌鎴戜滑緋葷粺涓璑PTL鐨勭増鏈彿)錛屽氨浼氬彂鐜皃thread_mutex_lock()鎿嶄綔濡傛灉娌℃湁閿佹垚鍔熺殑璇濆氨浼氳皟鐢╯ystem_wait()鐨勭郴緇熻皟鐢ㄥ茍灝嗗綋鍓嶇嚎紼嬪姞鍏ヨmutex鐨勭瓑寰呴槦鍒楅噷銆傝宻pin lock鍒欏彲浠ョ悊瑙d負鍦ㄤ竴涓獁hile(1)寰幆涓敤鍐呭祵鐨勬眹緙栦唬鐮佸疄鐜扮殑閿佹搷浣?鍗拌薄涓湅榪囦竴綃囪鏂囦粙緇嶈鍦╨inux鍐呮牳涓璼pin lock鎿嶄綔鍙渶瑕佷袱鏉PU鎸囦護錛岃В閿佹搷浣滃彧鐢ㄤ竴鏉℃寚浠ゅ氨鍙互瀹屾垚)銆傛湁鍏磋叮鐨勬湅鍙嬪彲浠ュ弬鑰冨彟涓涓悕涓簊anos鐨勫井鍐呮牳涓璸threds API鐨勫疄鐜幫細mutex.c spinlock.c錛屽敖綆′笌NPTL涓殑浠g爜瀹炵幇涓嶅敖鐩稿悓錛屼絾鏄洜涓哄畠鐨勫疄鐜伴潪甯哥畝鍗曟槗鎳傦紝瀵規垜浠悊瑙pin lock鍜宮utex鐨勭壒鎬ц繕鏄緢鏈夊府鍔╃殑銆?br> 閭d箞鍦ㄥ疄闄呯紪紼嬩腑mutex鍜宻pin lcok鍝釜鐨勬ц兘鏇村ソ鍛紵鎴戜滑鐭ラ亾spin lock鍦↙inux鍐呮牳涓湁闈炲父騫挎硾鐨勫埄鐢紝閭d箞榪欐槸涓嶆槸璇存槑spin lock鐨勬ц兘鏇村ソ鍛紵涓嬮潰璁╂垜浠潵鐢ㄥ疄闄呯殑浠g爜嫻嬭瘯涓涓嬶紙璇風‘淇濅綘鐨勭郴緇熶腑宸茬粡瀹夎浜嗘渶榪戠殑g++錛夈?br> 鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?01 // Name: spinlockvsmutex1.cc 002 // Source: [url]http://www.alexonlinux.com/pthread-mutex-vs-pthread-spinlock[/url] 003 // Compiler(<FONT style="BACKGROUND-COLOR: #00ffff">spin lock</FONT> version): g++ -o spin_version -DUSE_SPINLOCK spinlockvsmutex1.cc -lpthread 004 // Compiler(mutex version): g++ -o mutex_version spinlockvsmutex1.cc -lpthread 005 #include <stdio.h> 006 #include <unistd.h> 007 #include <sys/syscall.h> 008 #include <errno.h> 009 #include <sys/time.h> 010 #include <list> 011 #include <pthread.h> 012 013 #define LOOPS 50000000 014 015 using namespace std; 016 017 list<int> the_list; 018 019 #ifdef USE_SPINLOCK 020 pthread_spinlock_t spinlock; 021 #else 022 pthread_mutex_t mutex; 023 #endif 024 025 //Get the thread id 026 pid_t gettid() { return syscall( __NR_gettid ); } 027 028 void *consumer(void *ptr) 029 { 030 int i; 031 032 printf("Consumer TID %lun", (unsigned long)gettid()); 033 034 while (1) 035 { 036 #ifdef USE_SPINLOCK 037 pthread_spin_lock(&spinlock); 038 #else 039 pthread_mutex_lock(&mutex); 040 #endif 041 042 if (the_list.empty()) 043 { 044 #ifdef USE_SPINLOCK 045 pthread_spin_unlock(&spinlock); 046 #else 047 pthread_mutex_unlock(&mutex); 048 #endif 049 break; 050 } 051 052 i = the_list.front(); 053 the_list.pop_front(); 054 055 #ifdef USE_SPINLOCK 056 pthread_spin_unlock(&spinlock); 057 #else 058 pthread_mutex_unlock(&mutex); 059 #endif 060 } 061 062 return NULL; 063 } 064 065 int main() 066 { 067 int i; 068 pthread_t thr1, thr2; 069 struct timeval tv1, tv2; 070 071 #ifdef USE_SPINLOCK 072 pthread_spin_init(&spinlock, 0); 073 #else 074 pthread_mutex_init(&mutex, NULL); 075 #endif 076 077 // Creating the list content... 078 for (i = 0; i < LOOPS; i++) 079 the_list.push_back(i); 080 081 // Measuring time before starting the threads... 082 gettimeofday(&tv1, NULL); 083 084 pthread_create(&thr1, NULL, consumer, NULL); 085 pthread_create(&thr2, NULL, consumer, NULL); 086 087 pthread_join(thr1, NULL); 088 pthread_join(thr2, NULL); 089 090 // Measuring time after threads finished... 091 gettimeofday(&tv2, NULL); 092 093 if (tv1.tv_usec > tv2.tv_usec) 094 { 095 tv2.tv_sec--; 096 tv2.tv_usec += 1000000; 097 } 098 099 printf("Result - %ld.%ldn", tv2.tv_sec - tv1.tv_sec, 100 tv2.tv_usec - tv1.tv_usec); 101 102 #ifdef USE_SPINLOCK 103 pthread_spin_destroy(&spinlock); 104 #else 105 pthread_mutex_destroy(&mutex); 106 #endif 107 108 return 0; 109 } 璇ョ▼搴忚繍琛岃繃紼嬪涓嬶細涓葷嚎紼嬪厛鍒濆鍖栦竴涓猯ist緇撴瀯錛屽茍鏍規嵁LOOPS鐨勫煎皢瀵瑰簲鏁伴噺鐨別ntry鎻掑叆璇ist錛屼箣鍚庡垱寤轟袱涓柊綰跨▼錛屽畠浠兘鎵цconsumer()榪欎釜浠誨姟銆備袱涓鍒涘緩鐨勬柊綰跨▼鍚屾椂瀵硅繖涓猯ist榪涜pop鎿嶄綔銆備富綰跨▼浼氳綆椾粠鍒涘緩涓や釜鏂扮嚎紼嬪埌涓や釜鏂扮嚎紼嬬粨鏉熶箣闂存墍鐢ㄧ殑鏃墮棿錛岃緭鍑轟負涓嬫枃涓殑”Result “銆?br> 嫻嬭瘯鏈哄櫒鍙傛暟錛?br>Ubuntu 9.04 X86_64 Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz 4.0 GB Memory 浠庝笅闈㈡槸嫻嬭瘯緇撴灉錛?br> 鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?1 pxcwan@pxcwan-desktop:~/Workspace/mutex$ g++ -o spin_version -DUSE_SPINLOCK spinvsmutex1.cc -lpthread 02 pxcwan@pxcwan-desktop:~/Workspace/mutex$ g++ -o mutex_version spinvsmutex1.cc -lpthread 03 pxcwan@pxcwan-desktop:~/Workspace/mutex$ time ./spin_version 04 Consumer TID 5520 05 Consumer TID 5521 06 Result - 5.888750 07 08 real 0m10.918s 09 user 0m15.601s 10 sys 0m0.804s 11 12 pxcwan@pxcwan-desktop:~/Workspace/mutex$ time ./mutex_version 13 Consumer TID 5691 14 Consumer TID 5692 15 Result - 9.116376 16 17 real 0m14.031s 18 user 0m12.245s 19 sys 0m4.368s 鍙互鐪嬭spin lock鐨勭増鏈湪璇ョ▼搴忎腑琛ㄧ幇鍑烘潵鐨勬ц兘鏇村ソ銆傚彟澶栧煎緱娉ㄦ剰鐨勬槸sys鏃墮棿錛宮utex鐗堟湰鑺辮垂浜嗘洿澶氱殑緋葷粺璋冪敤鏃墮棿錛岃繖灝辨槸鍥犱負mutex浼氬湪閿佸啿紿佹椂璋冪敤system wait閫犳垚鐨勩?br> 浣嗘槸錛屾槸涓嶆槸璇磗pin lock灝變竴瀹氭洿濂戒簡鍛紵璁╂垜浠啀鏉ョ湅涓涓攣鍐茬獊紼嬪害闈炲父鍓х儓鐨勫疄渚嬬▼搴忥細 鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?1 //Name: svm2.c 02 //Source: [url]http://www.solarisinternals.com/wiki/index.php/DTrace_Topics_Locks[/url] 03 //Compile(<FONT style="BACKGROUND-COLOR: #00ffff">spin lock</FONT> version): gcc -o spin -DUSE_SPINLOCK svm2.c -lpthread 04 //Compile(mutex version): gcc -o mutex svm2.c -lpthread 05 #include <stdio.h> 06 #include <stdlib.h> 07 #include <pthread.h> 08 #include <sys/syscall.h> 09 10 #define THREAD_NUM 2 11 12 pthread_t g_thread[THREAD_NUM]; 13 #ifdef USE_SPINLOCK 14 pthread_spinlock_t g_spin; 15 #else 16 pthread_mutex_t g_mutex; 17 #endif 18 __uint64_t g_count; 19 20 pid_t gettid() 21 { 22 return syscall(SYS_gettid); 23 } 24 25 void *run_amuck(void *arg) 26 { 27 int i, j; 28 29 printf("Thread %lu started.n", (unsigned long)gettid()); 30 31 for (i = 0; i < 10000; i++) { 32 #ifdef USE_SPINLOCK 33 pthread_spin_lock(&g_spin); 34 #else 35 pthread_mutex_lock(&g_mutex); 36 #endif 37 for (j = 0; j < 100000; j++) { 38 if (g_count++ == 123456789) 39 printf("Thread %lu wins!n", (unsigned long)gettid()); 40 } 41 #ifdef USE_SPINLOCK 42 pthread_spin_unlock(&g_spin); 43 #else 44 pthread_mutex_unlock(&g_mutex); 45 #endif 46 } 47 48 printf("Thread %lu finished!n", (unsigned long)gettid()); 49 50 return (NULL); 51 } 52 53 int main(int argc, char *argv[]) 54 { 55 int i, threads = THREAD_NUM; 56 57 printf("Creating %d threads...n", threads); 58 #ifdef USE_SPINLOCK 59 pthread_spin_init(&g_spin, 0); 60 #else 61 pthread_mutex_init(&g_mutex, NULL); 62 #endif 63 for (i = 0; i < threads; i++) 64 pthread_create(&g_thread[i], NULL, run_amuck, (void *) i); 65 66 for (i = 0; i < threads; i++) 67 pthread_join(g_thread[i], NULL); 68 69 printf("Done.n"); 70 71 return (0); 72 } 榪欎釜紼嬪簭鐨勭壒寰佸氨鏄復鐣屽尯闈炲父澶э紝榪欐牱涓や釜綰跨▼鐨勯攣绔炰簤浼氶潪甯哥殑鍓х儓銆傚綋鐒惰繖涓槸涓涓瀬绔儏鍐碉紝瀹為檯搴旂敤紼嬪簭涓復鐣屽尯涓嶄細濡傛澶э紝閿佺珵浜変篃涓嶄細濡傛嬋鐑堛傛祴璇曠粨鏋滄樉紺簃utex鐗堟湰鎬ц兘鏇村ソ錛?br> 鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?1 pxcwan@pxcwan-desktop:~/Workspace/mutex$ time ./spin 02 Creating 2 threads... 03 Thread 31796 started. 04 Thread 31797 started. 05 Thread 31797 wins! 06 Thread 31797 finished! 07 Thread 31796 finished! 08 Done. 09 10 real 0m5.748s 11 user 0m10.257s 12 sys 0m0.004s 13 14 pxcwan@pxcwan-desktop:~/Workspace/mutex$ time ./mutex 15 Creating 2 threads... 16 Thread 31801 started. 17 Thread 31802 started. 18 Thread 31802 wins! 19 Thread 31802 finished! 20 Thread 31801 finished! 21 Done. 22 23 real 0m4.823s 24 user 0m4.772s 25 sys 0m0.032s 鍙﹀涓涓煎緱娉ㄦ剰鐨勭粏鑺傛槸spin lock鑰楄垂浜嗘洿澶氱殑user time銆傝繖灝辨槸鍥犱負涓や釜綰跨▼鍒嗗埆榪愯鍦ㄤ袱涓牳涓婏紝澶ч儴鍒嗘椂闂村彧鏈変竴涓嚎紼嬭兘鎷垮埌閿侊紝鎵浠ュ彟涓涓嚎紼嬪氨涓鐩村湪瀹冭繍琛岀殑core涓婅繘琛屽繖絳夊緟錛孋PU鍗犵敤鐜囦竴鐩存槸100%錛涜宮utex鍒欎笉鍚岋紝褰撳閿佺殑璇鋒眰澶辮觸鍚庝笂涓嬫枃鍒囨崲灝變細鍙戠敓錛岃繖鏍峰氨鑳界┖鍑轟竴涓牳鏉ヨ繘琛屽埆鐨勮繍綆椾換鍔′簡銆傦紙鍏跺疄榪欑涓婁笅鏂囧垏鎹㈠宸茬粡鎷跨潃閿佺殑閭d釜綰跨▼鎬ц兘涔熸槸鏈夊獎鍝嶇殑錛屽洜涓哄綋璇ョ嚎紼嬮噴鏀捐閿佹椂瀹冮渶瑕侀氱煡鎿嶄綔緋葷粺鍘誨敜閱掗偅浜涜闃誨鐨勭嚎紼嬶紝榪欎篃鏄澶栫殑寮閿錛?br> 鎬葷粨 錛?錛塎utex閫傚悎瀵歸攣鎿嶄綔闈炲父棰戠箒鐨勫満鏅紝騫朵笖鍏鋒湁鏇村ソ鐨勯傚簲鎬с傚敖綆$浉姣攕pin lock瀹冧細鑺辮垂鏇村鐨勫紑閿錛堜富瑕佹槸涓婁笅鏂囧垏鎹級錛屼絾鏄畠鑳介傚悎瀹為檯寮鍙戜腑澶嶆潅鐨勫簲鐢ㄥ満鏅紝鍦ㄤ繚璇佷竴瀹氭ц兘鐨勫墠鎻愪笅鎻愪緵鏇村ぇ鐨勭伒媧誨害銆?br> 錛?錛塻pin lock鐨刲ock/unlock鎬ц兘鏇村ソ(鑺辮垂鏇村皯鐨刢pu鎸囦護)錛屼絾鏄畠鍙傚簲鐢ㄤ簬涓寸晫鍖鴻繍琛屾椂闂村緢鐭殑鍦烘櫙銆傝屽湪瀹為檯杞歡寮鍙戜腑錛岄櫎闈炵▼搴忓憳瀵硅嚜宸辯殑紼嬪簭鐨勯攣鎿嶄綔琛屼負闈炲父鐨勪簡瑙o紝鍚﹀垯浣跨敤spin lock涓嶆槸涓涓ソ涓繪剰(閫氬父涓涓綰跨▼紼嬪簭涓閿佺殑鎿嶄綔鏈夋暟浠ヤ竾嬈★紝濡傛灉澶辮觸鐨勯攣鎿嶄綔(contended lock requests)榪囧鐨勮瘽灝變細嫻垂寰堝鐨勬椂闂磋繘琛岀┖絳夊緟)銆?br> 錛?錛夋洿淇濋櫓鐨勬柟娉曟垨璁告槸鍏堬紙淇濆畧鐨勶級浣跨敤 Mutex錛岀劧鍚庡鏋滃鎬ц兘榪樻湁榪涗竴姝ョ殑闇姹傦紝鍙互灝濊瘯浣跨敤spin lock榪涜璋冧紭銆傛瘯绔熸垜浠殑紼嬪簭涓嶅儚Linux kernel閭f牱瀵規ц兘闇姹傞偅涔堥珮(Linux Kernel鏈甯哥敤鐨勯攣鎿嶄綔鏄痵pin lock鍜宺w lock)銆?br> 2010騫?鏈?鏃ヨˉ璁幫細榪欎釜瑙傜偣鍦∣racle鐨勬枃妗d腑寰楀埌浜嗘敮鎸侊細 During configuration, Berkeley DB selects a mutex implementation for the architecture. Berkeley DB normally prefers blocking-mutex implementations over non-blocking ones. For example, Berkeley DB will select POSIX pthread mutex interfaces rather than assembly-code test-and-set spin mutexes because pthread mutexes are usually more efficient and less likely to waste CPU cycles spinning without getting any work accomplished. p.s.璋冪敤syscall(SYS_gettid)鍜宻yscall( __NR_gettid )閮藉彲浠ュ緱鍒板綋鍓嶇嚎紼嬬殑id:) 杞澆璇鋒敞鏄庢潵鑷? [url]www.parallellabs.com[/url] ------------------------------------------------------------------------------ spinlock涓巐inux鍐呮牳璋冨害鐨勫叧緋?br> 銆銆浣滆咃細鍒樻椽娑涳紝鍗庢竻榪滆宓屽叆寮忓煿璁腑蹇冮珮綰ц甯堬紝ARM鍏徃鎺堟潈ATC璁插笀銆?br> 騫垮憡鎻掓挱淇℃伅 緇村簱鏈鏂扮儹鍗栬姱鐗囷細 銆銆鍏充簬鑷棆閿佺敤娉曚粙緇嶇殑鏂囩珷錛屽凡緇忔湁寰堝錛屼絾鏈変簺緇嗚妭鐨勫湴鏂圭偣鐨勮繕涓嶅閫忋傛垜榪欓噷灝辨妸鎴戜釜浜鴻涓哄ぇ瀹跺鏄撴湁鐤戦棶鐨勫湴鏂規嬁鍑烘潵璁ㄨ涓涓嬨?br> 銆銆涓銆佽嚜鏃嬮攣錛坰pinlock錛夌畝浠?br> 銆銆鑷棆閿佸湪鍚屼竴鏃跺埢鍙兘琚渶澶氫竴涓唴鏍鎬換鍔℃寔鏈夛紝鎵浠ヤ竴涓椂鍒誨彧鏈変竴涓嚎紼嬪厑璁稿瓨鍦ㄤ簬涓寸晫鍖轟腑銆傝繖鐐瑰彲浠ュ簲鐢ㄥ湪澶氬鐞嗘満鍣ㄣ佹垨榪愯鍦ㄥ崟澶勭悊鍣ㄤ笂鐨勬姠鍗犲紡鍐呮牳涓渶瑕佺殑閿佸畾鏈嶅姟銆?br> 銆銆浜屻佷俊鍙烽噺綆浠?br> 銆銆榪欓噷涔熶粙緇嶄笅淇″彿閲忕殑姒傚康錛屽洜涓哄畠鐨勭敤娉曞拰鑷棆閿佹湁鐩鎬技鐨勫湴鏂廣?br> 銆銆Linux涓殑淇″彿閲忔槸涓縐嶇潯鐪犻攣銆傚鏋滄湁涓涓換鍔¤瘯鍥捐幏寰椾竴涓凡琚寔鏈夌殑淇″彿閲忔椂錛屼俊鍙烽噺浼氬皢鍏舵帹鍏ョ瓑寰呴槦鍒楋紝鐒跺悗璁╁叾鐫$湢銆傝繖鏃跺鐞嗗櫒鑾峰緱鑷敱鍘繪墽琛屽叾瀹冧唬鐮併傚綋鎸佹湁淇″彿閲忕殑榪涚▼灝嗕俊鍙烽噺閲婃斁鍚庯紝鍦ㄧ瓑寰呴槦鍒椾腑鐨勪竴涓換鍔″皢琚敜閱掞紝浠庤屼究鍙互鑾峰緱榪欎釜淇″彿閲忋?br> 銆銆涓夈佽嚜鏃嬮攣鍜屼俊鍙烽噺瀵規瘮 銆銆鍦ㄥ緢澶氬湴鏂硅嚜鏃嬮攣鍜屼俊鍙烽噺鍙互閫夋嫨浠諱綍涓涓嬌鐢紝浣嗕篃鏈変竴浜涘湴鏂瑰彧鑳介夋嫨鏌愪竴縐嶃備笅闈㈠姣斾竴浜涗袱鑰呯殑鐢ㄦ硶銆?br> 銆銆琛?-1鑷棆閿佸拰淇″彿閲忓姣?br> 銆銆鍥涖佽嚜鏃嬮攣涓巐inux鍐呮牳榪涚▼璋冨害鍏崇郴 銆銆鎴戜滑璁ㄨ涓嬭〃1-1涓殑絎?縐嶆儏鍐碉紙鍏跺畠鍑犵鎯呭喌姣旇緝濂界悊瑙o級錛屽鏋滀復鐣屽尯鍙兘鍖呭惈寮曡搗鐫$湢鐨勪唬鐮佸垯涓嶈兘浣跨敤鑷棆閿侊紝鍚﹀垯鍙兘寮曡搗姝婚攣銆?br> 銆銆閭d箞涓轟粈涔堜俊鍙烽噺淇濇姢鐨勪唬鐮佸彲浠ョ潯鐪犺岃嚜鏃嬮攣灝變笉鑳藉憿錛?br> 銆銆鍏堢湅涓嬭嚜鏃嬮攣鐨勫疄鐜版柟娉曞惂錛岃嚜鏃嬮攣鐨勫熀鏈艦寮忓涓嬶細 銆銆spin_lock(&mr_lock); 銆銆//涓寸晫鍖?br> 銆銆spin_unlock(&mr_lock); 銆銆璺熻釜涓涓媠pin_lock(&mr_lock)鐨勫疄鐜?br> 銆銆#define spin_lock(lock) _spin_lock(lock) 銆銆#define _spin_lock(lock) __LOCK(lock) 銆銆#define __LOCK(lock) \ 銆銆do { preempt_disable(); __acquire(lock); (void)(lock); } while (0) 銆銆娉ㄦ剰鍒?#8220;preempt_disable()”錛岃繖涓皟鐢ㄧ殑鍔熻兘鏄?#8220;鍏蟲姠鍗?#8221;錛堝湪spin_unlock涓細閲嶆柊寮鍚姠鍗犲姛鑳斤級銆備粠涓彲浠ョ湅鍑猴紝浣跨敤鑷棆閿佷繚鎶ょ殑鍖哄煙鏄伐浣滃湪闈炴姠鍗犵殑鐘舵侊紱鍗充嬌鑾峰彇涓嶅埌閿侊紝鍦?#8220;鑷棆”鐘舵佷篃鏄姝㈡姠鍗犵殑銆備簡瑙e埌榪欙紝鎴戞兂鍜變滑搴旇鑳藉鐞嗚В涓轟綍鑷棆閿佷繚鎶ょ殑浠g爜涓嶈兘鐫$湢浜嗐傝瘯鎯充竴涓嬶紝濡傛灉鍦ㄨ嚜鏃嬮攣淇濇姢鐨勪唬鐮佷腑闂寸潯鐪狅紝姝ゆ椂鍙戠敓榪涚▼璋冨害錛屽垯鍙兘鍙﹀涓涓繘紼嬩細鍐嶆璋冪敤spinlock淇濇姢鐨勮繖孌典唬鐮併傝屾垜浠幇鍦ㄧ煡閬撲簡鍗充嬌鍦ㄨ幏鍙栦笉鍒伴攣鐨?#8220;鑷棆”鐘舵侊紝涔熸槸紱佹鎶㈠崰鐨勶紝鑰?#8220;鑷棆”鍙堟槸鍔ㄦ佺殑錛屼笉浼氬啀鐫$湢浜嗭紝涔熷氨鏄鍦ㄨ繖涓鐞嗗櫒涓婁笉浼氬啀鏈夎繘紼嬭皟搴﹀彂鐢熶簡錛岄偅涔堟閿佽嚜鐒跺氨鍙戠敓浜嗐?br> 銆銆鍜變滑鍙互鎬葷粨涓嬭嚜鏃嬮攣鐨勭壒鐐癸細 銆銆鈼?鍗曞鐞嗗櫒闈炴姠鍗犲唴鏍鎬笅錛氳嚜鏃嬮攣浼氬湪緙栬瘧鏃惰蹇界暐錛?br> 銆銆鈼?鍗曞鐞嗗櫒鎶㈠崰鍐呮牳涓嬶細鑷棆閿佷粎浠呭綋浣滀竴涓緗唴鏍告姠鍗犵殑寮鍏籌紱 銆銆鈼?澶氬鐞嗗櫒涓嬶細姝ゆ椂鎵嶈兘瀹屽叏鍙戞尌鍑鴻嚜鏃嬮攣鐨勪綔鐢紝鑷棆閿佸湪鍐呮牳涓富瑕佺敤鏉ラ槻姝㈠澶勭悊鍣ㄤ腑騫跺彂璁塊棶涓寸晫鍖猴紝闃叉鍐呮牳鎶㈠崰閫犳垚鐨勭珵浜夈?br> 銆銆浜斻乴inux鎶㈠崰鍙戠敓鐨勬椂闂?br> 銆銆鏈鍚庡湪浜嗚В涓媗inux鎶㈠崰鍙戠敓鐨勬椂闂達紝鎶㈠崰鍒嗕負鐢ㄦ埛鎶㈠崰鍜屽唴鏍告姠鍗犮?br> 銆銆鐢ㄦ埛鎶㈠崰鍦ㄤ互涓嬫儏鍐典笅浜х敓錛?br> 銆銆鈼?浠庣郴緇熻皟鐢ㄨ繑鍥炵敤鎴風┖闂?br> 銆銆鈼?浠庝腑鏂鐞嗙▼搴忚繑鍥炵敤鎴風┖闂?br> 銆銆鍐呮牳鎶㈠崰浼氬彂鐢熷湪錛?br> 銆銆鈼?褰撲粠涓柇澶勭悊紼嬪簭榪斿洖鍐呮牳絀洪棿鐨勬椂鍊欙紝涓斿綋鏃跺唴鏍稿叿鏈夊彲鎶㈠崰鎬э紱 銆銆鈼?褰撳唴鏍鎬唬鐮佸啀涓嬈″叿鏈夊彲鎶㈠崰鎬х殑鏃跺欍傦紙濡?spin_unlock鏃訛級 銆銆鈼?濡傛灉鍐呮牳涓殑浠誨姟鏄懼紡鐨勮皟鐢╯chedule() 銆銆鈼?濡傛灉鍐呮牳涓殑浠誨姟闃誨銆?br> 銆銆鍩烘湰鐨勮繘紼嬭皟搴﹀氨鏄彂鐢熷湪鏃墮挓涓柇鍚庯紝騫朵笖鍙戠幇榪涚▼鐨勬椂闂寸墖宸茬粡浣跨敤瀹屼簡錛屽垯鍙戠敓榪涚▼鎶㈠崰銆傞氬父鎴戜滑浼氬埄鐢ㄤ腑鏂鐞嗙▼搴忚繑鍥炲唴鏍哥┖闂寸殑鏃跺欏彲浠ヨ繘琛屽唴鏍告姠鍗犺繖涓壒鎬ф潵鎻愰珮涓浜汭/O鎿嶄綔鐨勫疄鏃舵э紝濡傦細褰揑/O浜嬩歡鍙戠敓鐨勬槸鏃跺欙紝瀵瑰簲鐨勪腑鏂鐞嗙▼搴忚嬋媧伙紝褰撳畠鍙戠幇鏈夎繘紼嬪湪絳夊緟榪欎釜I/O浜嬩歡鐨勬椂鍊欙紝瀹冧細嬋媧葷瓑寰呰繘紼嬶紝騫朵笖璁劇疆褰撳墠姝e湪鎵ц榪涚▼鐨刵eed_resched鏍囧織錛岃繖鏍峰湪涓柇澶勭悊紼嬪簭榪斿洖鐨勬椂鍊欙紝璋冨害紼嬪簭琚縺媧伙紝鍘熸潵鍦ㄧ瓑寰匢/O浜嬩歡鐨勮繘紼嬶紙寰堝彲鑳斤級鑾峰緱鎵ц鏉冿紝浠庤屼繚璇佷簡瀵笽/O浜嬩歡鐨勭浉瀵瑰揩閫熷搷搴旓紙姣綰э級銆傚彲浠ョ湅鍑猴紝鍦↖/O浜嬩歡鍙戠敓鐨勬椂鍊欙紝I/O浜嬩歡鐨勫鐞嗚繘紼嬩細鎶㈠崰褰撳墠榪涚▼錛岀郴緇熺殑鍝嶅簲閫熷害涓庤皟搴︽椂闂寸墖鐨勯暱搴︽棤鍏熾?br>
]]>
武侠古典久久婷婷狼人伊人 |
久久综合九色综合久99 |
伊人色综合九久久天天蜜桃
|
97久久国产综合精品女不卡 |
久久伊人精品一区二区三区
|
久久91精品国产91久久麻豆
|
伊人久久综合精品无码AV专区 |
91精品国产高清久久久久久io
|
精品一区二区久久久久久久网站 |
久久99久久成人免费播放 |
国产精品久久久久久久久久影院 |
99国产精品久久 |
久久精品亚洲AV久久久无码 |
日韩精品国产自在久久现线拍 |
日产精品久久久久久久 |
中文字幕亚洲综合久久2 |
欧洲精品久久久av无码电影 |
亚洲国产成人久久综合碰 |
青青青伊人色综合久久 |
久久久亚洲欧洲日产国码二区 |
亚洲精品成人网久久久久久 |
国产ww久久久久久久久久 |
91精品国产综合久久精品 |
久久久亚洲裙底偷窥综合 |
亚洲伊人久久综合影院 |
久久国产香蕉视频 |
精品无码人妻久久久久久 |
亚洲成色999久久网站 |
国产精品一久久香蕉国产线看
|
亚洲国产美女精品久久久久∴
|
久久这里只有精品首页 |
国内精品久久久久影院优
|
精品久久久无码人妻中文字幕
|
久久精品亚洲欧美日韩久久 |
久久精品草草草 |
国产精品日韩深夜福利久久 |
人人狠狠综合久久亚洲婷婷 |
久久精品国产精品青草app |
91精品国产9l久久久久 |
久久婷婷久久一区二区三区 |
色综合久久88色综合天天 |