锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美三级乱码,国产日韩精品在线,欧美精品自拍偷拍动漫精品 http://m.shnenglu.com/ccl0326/archive/2010/12/16/136635.htmlVincent Vincent Thu, 16 Dec 2010 06:37:00 GMT http://m.shnenglu.com/ccl0326/archive/2010/12/16/136635.html http://m.shnenglu.com/ccl0326/comments/136635.html http://m.shnenglu.com/ccl0326/archive/2010/12/16/136635.html#Feedback 0 http://m.shnenglu.com/ccl0326/comments/commentRss/136635.html http://m.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鍙互璁や負(fù)綰跨▼a宸茬粡瀛樺湪 浣嗘槸鍦ㄦ2鎵ц瀹屼互鍚庯紝涓葷嚎紼嬪茍涓嶇煡閬撶嚎紼媋鍜岀嚎紼媌璋佸厛鎵ц錛屽茍涓嶈兘鍦ㄨ繖閲屽仛綰跨▼a鍏堜簬綰跨▼b鎵ц鐨勫亣璁?br>鍥犱負(fù)綰跨▼鐨勬椂闂寸墖鍒嗛厤鍦ㄨ繖閲屾槸鏈煡鐨?/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://m.shnenglu.com/ccl0326/archive/2010/09/21/127247.htmlVincent Vincent Tue, 21 Sep 2010 07:15:00 GMT http://m.shnenglu.com/ccl0326/archive/2010/09/21/127247.html http://m.shnenglu.com/ccl0326/comments/127247.html http://m.shnenglu.com/ccl0326/archive/2010/09/21/127247.html#Feedback 0 http://m.shnenglu.com/ccl0326/comments/commentRss/127247.html http://m.shnenglu.com/ccl0326/services/trackbacks/127247.html Pthreads鎻愪緵浜嗗縐嶉攣鏈哄埗錛?br>(1) Mutex錛堜簰鏂ラ噺錛夛細(xì)pthread_mutex_*** (2) Spin lock錛堣嚜鏃嬮攣錛夛細(xì)pthread_spin_*** (3) Condition Variable錛堟潯浠跺彉閲忥級錛歱thread_con_*** (4) Read/Write lock錛堣鍐欓攣錛夛細(xì)pthread_rwlock_*** Pthreads鎻愪緵鐨凪utex閿佹搷浣滅浉鍏崇殑API涓昏鏈夛細(xì) 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涓昏鏈夛細(xì) 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鎿嶄綔鍘誨緱鍒頒竴涓復(fù)鐣屽尯鐨勯攣錛岃屾鏃惰繖涓攣姝h綰跨▼B鎵鎸佹湁錛岄偅涔堢嚎紼婣灝變細(xì)琚樆濉?blocking)錛孋ore0 浼?xì)鍦ㄦ鏃稑q涜涓婁笅鏂囧垏鎹?Context Switch)灝嗙嚎紼婣緗簬絳夊緟闃熷垪涓紝姝ゆ椂Core0灝卞彲浠ヨ繍琛屽叾浠栫殑浠誨姟(渚嬪鍙︿竴涓嚎紼婥)鑰屼笉蹇呰繘琛屽繖絳夊緟銆傝孲pin lock鍒欎笉鐒訛紝瀹冨睘浜巄usy-waiting綾誨瀷鐨勯攣錛屽鏋滅嚎紼婣鏄嬌鐢╬thread_spin_lock鎿嶄綔鍘昏姹傞攣錛岄偅涔堢嚎紼婣灝變細(xì)涓鐩村湪 Core0涓婅繘琛屽繖絳夊緟騫朵笉鍋滅殑榪涜閿佽姹傦紝鐩村埌寰楀埌榪欎釜閿佷負(fù)姝€?br> 濡傛灉澶у鍘繪煡闃匧inux glibc涓pthreads API鐨勫疄鐜癗PTL(Native POSIX Thread Library) 鐨勬簮鐮佺殑璇?浣跨敤”getconf GNU_LIBPTHREAD_VERSION”鍛戒護鍙互寰楀埌鎴戜滑緋葷粺涓璑PTL鐨勭増鏈彿)錛屽氨浼?xì)鍙戠幇pthread_mutex_lock()鎿嶄綔濡傛灉娌℃湁閿佹垚鍔熺殑璇濆氨浼?xì)璋冪敤system_wait()鐨勭郴緇熻皟鐢ㄥ茍灝嗗綋鍓嶇嚎紼嬪姞鍏ヨmutex鐨勭瓑寰呴槦鍒楅噷銆傝宻pin lock鍒欏彲浠ョ悊瑙d負(fù)鍦ㄤ竴涓獁hile(1)寰幆涓敤鍐呭祵鐨勬眹緙栦唬鐮佸疄鐜扮殑閿佹搷浣?鍗拌薄涓湅榪囦竴綃囪鏂囦粙緇嶈鍦╨inux鍐呮牳涓璼pin lock鎿嶄綔鍙渶瑕佷袱鏉PU鎸囦護錛岃В閿佹搷浣滃彧鐢ㄤ竴鏉℃寚浠ゅ氨鍙互瀹屾垚)銆傛湁鍏磋叮鐨勬湅鍙嬪彲浠ュ弬鑰冨彟涓涓悕涓簊anos鐨勫井鍐呮牳涓璸threds API鐨勫疄鐜幫細(xì)mutex.c spinlock.c錛屽敖綆′笌NPTL涓殑浠g爜瀹炵幇涓嶅敖鐩稿悓錛屼絾鏄洜涓哄畠鐨勫疄鐜伴潪甯哥畝鍗曟槗鎳傦紝瀵規(guī)垜浠悊瑙pin lock鍜宮utex鐨勭壒鎬ц繕鏄緢鏈夊府鍔╃殑銆?br> 閭d箞鍦ㄥ疄闄呯紪紼嬩腑mutex鍜宻pin lcok鍝釜鐨勬ц兘鏇村ソ鍛紵鎴戜滑鐭ラ亾spin lock鍦↙inux鍐呮牳涓湁闈炲父騫挎硾鐨勫埄鐢紝閭d箞榪欐槸涓嶆槸璇存槑spin lock鐨勬ц兘鏇村ソ鍛紵涓嬮潰璁╂垜浠潵鐢ㄥ疄闄呯殑浠g爜嫻嬭瘯涓涓嬶紙璇風(fēng)‘淇濅綘鐨勭郴緇熶腑宸茬粡瀹夎浜嗘渶榪戠殑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 } 璇ョ▼搴忚繍琛岃繃紼嬪涓嬶細(xì)涓葷嚎紼嬪厛鍒濆鍖栦竴涓猯ist緇撴瀯錛屽茍鏍規(guī)嵁LOOPS鐨勫煎皢瀵瑰簲鏁伴噺鐨別ntry鎻掑叆璇ist錛屼箣鍚庡垱寤轟袱涓柊綰跨▼錛屽畠浠兘鎵цconsumer()榪欎釜浠誨姟銆備袱涓鍒涘緩鐨勬柊綰跨▼鍚屾椂瀵硅繖涓猯ist榪涜pop鎿嶄綔銆備富綰跨▼浼?xì)璁〗帡浠庡垱寰忎袱涓柊绾拷E嬪埌涓や釜鏂扮嚎紼嬬粨鏉熶箣闂存墍鐢ㄧ殑鏃墮棿錛岃緭鍑轟負(fù)涓嬫枃涓殑”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鐗堟湰鑺辮垂浜嗘洿澶氱殑緋葷粺璋冪敤鏃墮棿錛岃繖灝辨槸鍥犱負(fù)mutex浼?xì)鍦ㄩ攣鍐步H佹椂璋冪敤system wait閫犳垚鐨勩?br> 浣嗘槸錛屾槸涓嶆槸璇磗pin lock灝變竴瀹氭洿濂戒簡鍛紵璁╂垜浠啀鏉ョ湅涓涓攣鍐茬獊紼嬪害闈炲父鍓х儓鐨勫疄渚嬬▼搴忥細(xì) 鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?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 } 榪欎釜紼嬪簭鐨勭壒寰佸氨鏄復(fù)鐣屽尯闈炲父澶э紝榪欐牱涓や釜綰跨▼鐨勯攣绔炰簤浼?xì)闈炲父鐨勫墽鐑堛傚綋鐒惰繖涓槸涓涓瀬绔儏鍐碉紝瀹為檯搴旂敤紼嬪簭涓復(fù)鐣屽尯涓嶄細(xì)濡傛澶э紝閿佺珵浜変篃涓嶄細(xì)濡傛嬋鐑堛傛祴璇曠粨鏋滄樉紺簃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銆傝繖灝辨槸鍥犱負(fù)涓や釜綰跨▼鍒嗗埆榪愯鍦ㄤ袱涓牳涓婏紝澶ч儴鍒嗘椂闂村彧鏈変竴涓嚎紼嬭兘鎷垮埌閿侊紝鎵浠ュ彟涓涓嚎紼嬪氨涓鐩村湪瀹冭繍琛岀殑core涓婅繘琛屽繖絳夊緟錛孋PU鍗犵敤鐜囦竴鐩存槸100%錛涜宮utex鍒欎笉鍚岋紝褰撳閿佺殑璇鋒眰澶辮觸鍚庝笂涓嬫枃鍒囨崲灝變細(xì)鍙戠敓錛岃繖鏍峰氨鑳界┖鍑轟竴涓牳鏉ヨ繘琛屽埆鐨勮繍綆椾換鍔′簡銆傦紙鍏跺疄榪欑涓婁笅鏂囧垏鎹㈠宸茬粡鎷跨潃閿佺殑閭d釜綰跨▼鎬ц兘涔熸槸鏈夊獎鍝嶇殑錛屽洜涓哄綋璇ョ嚎紼嬮噴鏀捐閿佹椂瀹冮渶瑕侀氱煡鎿嶄綔緋葷粺鍘誨敜閱掗偅浜涜闃誨鐨勭嚎紼嬶紝榪欎篃鏄澶栫殑寮閿錛?br> 鎬葷粨 錛?錛塎utex閫傚悎瀵歸攣鎿嶄綔闈炲父棰戠箒鐨勫満鏅紝騫朵笖鍏鋒湁鏇村ソ鐨勯傚簲鎬с傚敖綆$浉姣攕pin lock瀹冧細(xì)鑺辮垂鏇村鐨勫紑閿錛堜富瑕佹槸涓婁笅鏂囧垏鎹級錛屼絾鏄畠鑳介傚悎瀹為檯寮鍙戜腑澶嶆潅鐨勫簲鐢ㄥ満鏅紝鍦ㄤ繚璇佷竴瀹氭ц兘鐨勫墠鎻愪笅鎻愪緵鏇村ぇ鐨勭伒媧誨害銆?br> 錛?錛塻pin lock鐨刲ock/unlock鎬ц兘鏇村ソ(鑺辮垂鏇村皯鐨刢pu鎸囦護)錛屼絾鏄畠鍙傚簲鐢ㄤ簬涓寸晫鍖鴻繍琛屾椂闂村緢鐭殑鍦烘櫙銆傝屽湪瀹為檯杞歡寮鍙戜腑錛岄櫎闈炵▼搴忓憳瀵硅嚜宸辯殑紼嬪簭鐨勯攣鎿嶄綔琛屼負(fù)闈炲父鐨勪簡瑙o紝鍚﹀垯浣跨敤spin lock涓嶆槸涓涓ソ涓繪剰(閫氬父涓涓綰跨▼紼嬪簭涓閿佺殑鎿嶄綔鏈夋暟浠ヤ竾嬈★紝濡傛灉澶辮觸鐨勯攣鎿嶄綔(contended lock requests)榪囧鐨勮瘽灝變細(xì)嫻垂寰堝鐨勬椂闂磋繘琛岀┖絳夊緟)銆?br> 錛?錛夋洿淇濋櫓鐨勬柟娉曟垨璁告槸鍏堬紙淇濆畧鐨勶級浣跨敤 Mutex錛岀劧鍚庡鏋滃鎬ц兘榪樻湁榪涗竴姝ョ殑闇姹傦紝鍙互灝濊瘯浣跨敤spin lock榪涜璋冧紭銆傛瘯绔熸垜浠殑紼嬪簭涓嶅儚Linux kernel閭f牱瀵規(guī)ц兘闇姹傞偅涔堥珮(Linux Kernel鏈甯哥敤鐨勯攣鎿嶄綔鏄痵pin lock鍜宺w lock)銆?br> 2010騫?鏈?鏃ヨˉ璁幫細(xì)榪欎釜瑙傜偣鍦∣racle鐨勬枃妗d腑寰楀埌浜嗘敮鎸侊細(xì) 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> 銆銆浣滆咃細(xì)鍒樻椽娑涳紝鍗庢竻榪滆宓屽叆寮忓煿璁腑蹇冮珮綰ц甯堬紝ARM鍏徃鎺堟潈ATC璁插笀銆?br> 騫垮憡鎻掓挱淇℃伅 緇村簱鏈鏂扮儹鍗栬姱鐗囷細(xì) 銆銆鍏充簬鑷棆閿佺敤娉曚粙緇嶇殑鏂囩珷錛屽凡緇忔湁寰堝錛屼絾鏈変簺緇嗚妭鐨勫湴鏂圭偣鐨勮繕涓嶅閫忋傛垜榪欓噷灝辨妸鎴戜釜浜鴻涓哄ぇ瀹跺鏄撴湁鐤戦棶鐨勫湴鏂規(guī)嬁鍑烘潵璁ㄨ涓涓嬨?br> 銆銆涓銆佽嚜鏃嬮攣錛坰pinlock錛夌畝浠?br> 銆銆鑷棆閿佸湪鍚屼竴鏃跺埢鍙兘琚渶澶氫竴涓唴鏍鎬換鍔℃寔鏈夛紝鎵浠ヤ竴涓椂鍒誨彧鏈変竴涓嚎紼嬪厑璁稿瓨鍦ㄤ簬涓寸晫鍖轟腑銆傝繖鐐瑰彲浠ュ簲鐢ㄥ湪澶氬鐞嗘満鍣ㄣ佹垨榪愯鍦ㄥ崟澶勭悊鍣ㄤ笂鐨勬姠鍗犲紡鍐呮牳涓渶瑕佺殑閿佸畾鏈嶅姟銆?br> 銆銆浜屻佷俊鍙烽噺綆浠?br> 銆銆榪欓噷涔熶粙緇嶄笅淇″彿閲忕殑姒傚康錛屽洜涓哄畠鐨勭敤娉曞拰鑷棆閿佹湁鐩鎬技鐨勫湴鏂廣?br> 銆銆Linux涓殑淇″彿閲忔槸涓縐嶇潯鐪犻攣銆傚鏋滄湁涓涓換鍔¤瘯鍥捐幏寰椾竴涓凡琚寔鏈夌殑淇″彿閲忔椂錛屼俊鍙烽噺浼?xì)灏嗗叾鎺ㄥ叆绛夊緟闃熷垪锛岀劧鍚庤鍏剁潯鐪犮傝繖鏃跺鐞嗗櫒鑾峰緱鑷敱鍘繪墽琛屽叾瀹冧唬鐮併傚綋鎸佹湁淇″彿閲忕殑榪涚▼灝嗕俊鍙烽噺閲婃斁鍚庯紝鍦ㄧ瓑寰呴槦鍒椾腑鐨勪竴涓換鍔″皢琚敜閱掞紝浠庤屼究鍙互鑾峰緱榪欎釜淇″彿閲忋?br> 銆銆涓夈佽嚜鏃嬮攣鍜屼俊鍙烽噺瀵規(guī)瘮 銆銆鍦ㄥ緢澶氬湴鏂硅嚜鏃嬮攣鍜屼俊鍙烽噺鍙互閫夋嫨浠諱綍涓涓嬌鐢紝浣嗕篃鏈変竴浜涘湴鏂瑰彧鑳介夋嫨鏌愪竴縐嶃備笅闈㈠姣斾竴浜涗袱鑰呯殑鐢ㄦ硶銆?br> 銆銆琛?-1鑷棆閿佸拰淇″彿閲忓姣?br> 銆銆鍥涖佽嚜鏃嬮攣涓巐inux鍐呮牳榪涚▼璋冨害鍏崇郴 銆銆鎴戜滑璁ㄨ涓嬭〃1-1涓殑絎?縐嶆儏鍐碉紙鍏跺畠鍑犵鎯呭喌姣旇緝濂界悊瑙o級錛屽鏋滀復(fù)鐣屽尯鍙兘鍖呭惈寮曡搗鐫$湢鐨勪唬鐮佸垯涓嶈兘浣跨敤鑷棆閿侊紝鍚﹀垯鍙兘寮曡搗姝婚攣銆?br> 銆銆閭d箞涓轟粈涔堜俊鍙烽噺淇濇姢鐨勪唬鐮佸彲浠ョ潯鐪犺岃嚜鏃嬮攣灝變笉鑳藉憿錛?br> 銆銆鍏堢湅涓嬭嚜鏃嬮攣鐨勫疄鐜版柟娉曞惂錛岃嚜鏃嬮攣鐨勫熀鏈艦寮忓涓嬶細(xì) 銆銆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涓細(xì)閲嶆柊寮鍚姠鍗犲姛鑳斤級銆備粠涓彲浠ョ湅鍑猴紝浣跨敤鑷棆閿佷繚鎶ょ殑鍖哄煙鏄伐浣滃湪闈炴姠鍗犵殑鐘舵侊紱鍗充嬌鑾峰彇涓嶅埌閿侊紝鍦?#8220;鑷棆”鐘舵佷篃鏄姝㈡姠鍗犵殑銆備簡瑙e埌榪欙紝鎴戞兂鍜變滑搴旇鑳藉鐞嗚В涓轟綍鑷棆閿佷繚鎶ょ殑浠g爜涓嶈兘鐫$湢浜嗐傝瘯鎯充竴涓嬶紝濡傛灉鍦ㄨ嚜鏃嬮攣淇濇姢鐨勪唬鐮佷腑闂寸潯鐪狅紝姝ゆ椂鍙戠敓榪涚▼璋冨害錛屽垯鍙兘鍙﹀涓涓繘紼嬩細(xì)鍐嶆璋冪敤spinlock淇濇姢鐨勮繖孌典唬鐮併傝屾垜浠幇鍦ㄧ煡閬撲簡鍗充嬌鍦ㄨ幏鍙栦笉鍒伴攣鐨?#8220;鑷棆”鐘舵侊紝涔熸槸紱佹鎶㈠崰鐨勶紝鑰?#8220;鑷棆”鍙堟槸鍔ㄦ佺殑錛屼笉浼?xì)鍐嶇潯鐪犱簡锛屼篃灏辨槸璇村湪杩欎釜澶勭悊鍣ㄤ笂涓嶄細(xì)鍐嶆湁杩浗E嬭皟搴﹀彂鐢熶簡錛岄偅涔堟閿佽嚜鐒跺氨鍙戠敓浜嗐?br> 銆銆鍜變滑鍙互鎬葷粨涓嬭嚜鏃嬮攣鐨勭壒鐐癸細(xì) 銆銆鈼?鍗曞鐞嗗櫒闈炴姠鍗犲唴鏍鎬笅錛氳嚜鏃嬮攣浼?xì)鍦ň~栬瘧鏃惰蹇界暐錛?br> 銆銆鈼?鍗曞鐞嗗櫒鎶㈠崰鍐呮牳涓嬶細(xì)鑷棆閿佷粎浠呭綋浣滀竴涓緗唴鏍告姠鍗犵殑寮鍏籌紱 銆銆鈼?澶氬鐞嗗櫒涓嬶細(xì)姝ゆ椂鎵嶈兘瀹屽叏鍙戞尌鍑鴻嚜鏃嬮攣鐨勪綔鐢紝鑷棆閿佸湪鍐呮牳涓富瑕佺敤鏉ラ槻姝㈠澶勭悊鍣ㄤ腑騫跺彂璁塊棶涓寸晫鍖猴紝闃叉鍐呮牳鎶㈠崰閫犳垚鐨勭珵浜夈?br> 銆銆浜斻乴inux鎶㈠崰鍙戠敓鐨勬椂闂?br> 銆銆鏈鍚庡湪浜嗚В涓媗inux鎶㈠崰鍙戠敓鐨勬椂闂達紝鎶㈠崰鍒嗕負(fù)鐢ㄦ埛鎶㈠崰鍜屽唴鏍告姠鍗犮?br> 銆銆鐢ㄦ埛鎶㈠崰鍦ㄤ互涓嬫儏鍐典笅浜х敓錛?br> 銆銆鈼?浠庣郴緇熻皟鐢ㄨ繑鍥炵敤鎴風(fēng)┖闂?br> 銆銆鈼?浠庝腑鏂鐞嗙▼搴忚繑鍥炵敤鎴風(fēng)┖闂?br> 銆銆鍐呮牳鎶㈠崰浼?xì)鍙戠敓鍦ㄥQ?br> 銆銆鈼?褰撲粠涓柇澶勭悊紼嬪簭榪斿洖鍐呮牳絀洪棿鐨勬椂鍊欙紝涓斿綋鏃跺唴鏍稿叿鏈夊彲鎶㈠崰鎬э紱 銆銆鈼?褰撳唴鏍鎬唬鐮佸啀涓嬈″叿鏈夊彲鎶㈠崰鎬х殑鏃跺欍傦紙濡?spin_unlock鏃訛級 銆銆鈼?濡傛灉鍐呮牳涓殑浠誨姟鏄懼紡鐨勮皟鐢╯chedule() 銆銆鈼?濡傛灉鍐呮牳涓殑浠誨姟闃誨銆?br> 銆銆鍩烘湰鐨勮繘紼嬭皟搴﹀氨鏄彂鐢熷湪鏃墮挓涓柇鍚庯紝騫朵笖鍙戠幇榪涚▼鐨勬椂闂寸墖宸茬粡浣跨敤瀹屼簡錛屽垯鍙戠敓榪涚▼鎶㈠崰銆傞氬父鎴戜滑浼?xì)鍒╃敤涓柇澶勭悊绋嬪簭杩斿洖鍐呮牳绌洪棿鐨勬椂鍊欏彲浠ヨ繘琛屽唴鏍告姠鍗犺繖涓壒鎬ф潵鎻愰珮涓浜汭/O鎿嶄綔鐨勫疄鏃舵э紝濡傦細(xì)褰揑/O浜嬩歡鍙戠敓鐨勬槸鏃跺欙紝瀵瑰簲鐨勪腑鏂鐞嗙▼搴忚嬋媧伙紝褰撳畠鍙戠幇鏈夎繘紼嬪湪絳夊緟榪欎釜I/O浜嬩歡鐨勬椂鍊欙紝瀹冧細(xì)嬋媧葷瓑寰呰繘紼嬶紝騫朵笖璁劇疆褰撳墠姝e湪鎵ц榪涚▼鐨刵eed_resched鏍囧織錛岃繖鏍峰湪涓柇澶勭悊紼嬪簭榪斿洖鐨勬椂鍊欙紝璋冨害紼嬪簭琚縺媧伙紝鍘熸潵鍦ㄧ瓑寰匢/O浜嬩歡鐨勮繘紼嬶紙寰堝彲鑳斤級鑾峰緱鎵ц鏉冿紝浠庤屼繚璇佷簡瀵笽/O浜嬩歡鐨勭浉瀵瑰揩閫熷搷搴旓紙姣綰э級銆傚彲浠ョ湅鍑猴紝鍦↖/O浜嬩歡鍙戠敓鐨勬椂鍊欙紝I/O浜嬩歡鐨勫鐞嗚繘紼嬩細(xì)鎶㈠崰褰撳墠榪涚▼錛岀郴緇熺殑鍝嶅簲閫熷害涓庤皟搴︽椂闂寸墖鐨勯暱搴︽棤鍏熾?br>
]]> 青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
久久精品动漫 |
99re66热这里只有精品4 |
久久天堂av综合合色 |
亚洲欧美日韩国产一区二区三区 |
亚洲美女av电影 |
亚洲无亚洲人成网站77777
|
亚洲在线观看免费视频 |
亚洲一级片在线观看 |
亚洲专区在线视频 |
欧美一二三视频 |
免费成人黄色 |
99www免费人成精品 |
午夜精品福利视频 |
免费高清在线一区 |
欧美性大战久久久久 |
黑人巨大精品欧美一区二区小视频
|
日韩一级大片 |
亚洲一区二区在线观看视频 |
国产精品网站在线观看 |
欧美成人激情视频免费观看 |
久久久久一区二区三区 |
欧美精品激情blacked18 |
国产精品久久久久久久久久免费看
|
国产免费亚洲高清 |
亚洲高清不卡av |
亚洲一区图片 |
欧美1区3d |
欧美亚洲综合在线 |
欧美日韩国产精品成人 |
在线视频国产日韩 |
欧美在线视频不卡 |
9久草视频在线视频精品 |
久久亚洲精品伦理 |
国产偷国产偷亚洲高清97cao |
亚洲精品小视频在线观看 |
欧美一区二区三区播放老司机
|
在线亚洲欧美视频 |
免费高清在线视频一区· |
亚洲桃花岛网站 |
欧美日韩国产欧 |
亚洲激情在线视频 |
久久久久久穴 |
午夜久久黄色 |
国产精品久久久久久久久久久久 |
最新高清无码专区 |
你懂的国产精品 |
久久国产精品色婷婷 |
国产精品视频免费在线观看 |
一区二区三区日韩精品 |
你懂的视频一区二区 |
久久精品国产一区二区电影 |
国产精品羞羞答答 |
欧美在线视频免费播放 |
亚洲欧美久久久 |
国产三区二区一区久久
|
欧美韩日高清 |
老司机精品久久 |
亚洲欧洲在线观看 |
亚洲激情成人 |
欧美激情精品久久久久久蜜臀 |
在线日韩中文 |
欧美激情中文字幕乱码免费 |
免费亚洲电影在线 |
亚洲免费播放 |
一区二区三区成人 |
国产精品网红福利 |
久久美女性网 |
美女视频一区免费观看 |
亚洲欧洲一区二区三区久久 |
久久亚洲综合色 |
亚洲高清视频中文字幕 |
久久亚洲综合色 |
久久午夜视频 |
亚洲精品一区二区三区蜜桃久 |
亚洲黄色天堂 |
国产精品久久波多野结衣 |
欧美亚洲免费 |
久久久久免费视频 |
9色国产精品 |
亚洲你懂的在线视频 |
精品白丝av |
亚洲精品视频在线看 |
国产精品香蕉在线观看 |
麻豆精品视频在线观看 |
欧美国产日本在线 |
欧美一区三区二区在线观看 |
久久久蜜桃一区二区人 |
亚洲视频1区 |
久久人人97超碰国产公开结果 |
日韩一区二区精品 |
久久不射中文字幕 |
亚洲深夜福利在线 |
久久久水蜜桃av免费网站 |
一本色道久久综合一区 |
性感少妇一区 |
日韩天堂在线观看 |
久久xxxx |
亚洲在线中文字幕 |
玖玖精品视频 |
香港久久久电影 |
欧美精品一卡 |
蜜臀av在线播放一区二区三区 |
欧美日韩在线视频一区二区 |
免费观看不卡av |
国产精品美女xx |
亚洲国产精品高清久久久 |
国产偷自视频区视频一区二区 |
亚洲精品中文字幕有码专区 |
狠狠色狠狠色综合日日五 |
99av国产精品欲麻豆 |
亚洲二区免费 |
欧美在线看片 |
欧美一级电影久久 |
欧美日韩小视频 |
亚洲大胆女人 |
亚洲第一毛片 |
久久久人成影片一区二区三区 |
亚洲免费在线视频 |
欧美人在线视频 |
欧美激情一区二区在线 |
国内精品久久久久影院色 |
一区二区三区精品 |
一本色道久久88综合亚洲精品ⅰ
|
久久三级福利 |
久久免费少妇高潮久久精品99 |
国产精品国产一区二区 |
亚洲精品护士 |
亚洲精品乱码久久久久久按摩观 |
久久久久久久欧美精品 |
久久亚洲国产精品一区二区 |
国产午夜精品一区二区三区视频 |
久久久久国产精品一区 |
一级日韩一区在线观看 |
中文精品在线 |
欧美日韩在线第一页 |
99国内精品 |
亚洲欧美久久久久一区二区三区 |
欧美日本在线 |
亚洲乱码精品一二三四区日韩在线 |
亚洲精品美女在线观看播放 |
免费在线观看一区二区 |
亚洲国产精品激情在线观看 |
亚洲精品一区二区三区四区高清 |
美女视频一区免费观看 |
亚洲经典自拍 |
亚洲午夜av在线 |
国产日韩精品视频一区 |
久久久久久久久久久久久女国产乱 |
麻豆freexxxx性91精品 |
亚洲毛片播放 |
国产精品无码永久免费888 |
欧美一级免费视频 |
美日韩精品免费观看视频 |
亚洲黄色高清 |
国产精品www. |
久久九九精品 |
亚洲精品欧美专区 |
欧美一区二区网站 |
亚洲电影一级黄 |
欧美日韩精品三区 |
亚洲欧美色婷婷 |
欧美成人第一页 |
亚洲专区免费 |
在线欧美视频 |
国产精品对白刺激久久久 |
欧美诱惑福利视频 |
亚洲人成网站色ww在线 |
香蕉久久夜色精品国产 |
亚洲韩日在线 |
国产视频一区免费看 |
欧美精品v日韩精品v国产精品 |
亚洲综合久久久久 |
亚洲人成在线免费观看 |
欧美在线一二三区 |
亚洲精品小视频在线观看 |
国产欧美日韩综合精品二区 |
久久久亚洲成人 |
亚洲婷婷在线 |
亚洲国产精品成人va在线观看 |
欧美在线观看www |
一区二区日韩 |
亚洲二区在线观看 |
国产日韩欧美综合精品 |
欧美日韩国产一中文字不卡 |
久久乐国产精品 |
午夜精品福利一区二区三区av |
亚洲激情视频在线 |
美女脱光内衣内裤视频久久影院
|
美女视频黄a大片欧美 |
亚洲一区综合 |
夜夜嗨网站十八久久 |
亚洲国产精品热久久 |
国产一区二区三区在线免费观看 |
欧美三区美女 |
欧美日韩小视频 |
欧美国产一区二区 |
久久精品成人一区二区三区 |
亚洲在线一区二区三区 |
中国成人黄色视屏 |
99国产精品 |