锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品对白刺激久久久,久久精品国产清自在天天线,伊人久久亚洲综合影院http://www.shnenglu.com/ccl0326/archive/2010/12/16/136635.htmlVincentVincentThu, 16 Dec 2010 06:37:00 GMThttp://www.shnenglu.com/ccl0326/archive/2010/12/16/136635.htmlhttp://www.shnenglu.com/ccl0326/comments/136635.htmlhttp://www.shnenglu.com/ccl0326/archive/2010/12/16/136635.html#Feedback0http://www.shnenglu.com/ccl0326/comments/commentRss/136635.htmlhttp://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



Vincent 2010-12-16 14:37 鍙戣〃璇勮
]]>
銆愯漿銆戠嚎紼嬪悓姝?鑷棆閿佷笌Mutex/淇″彿閲忕殑鍖哄埆鍜岃仈緋?/title><link>http://www.shnenglu.com/ccl0326/archive/2010/09/21/127247.html</link><dc:creator>Vincent</dc:creator><author>Vincent</author><pubDate>Tue, 21 Sep 2010 07:15:00 GMT</pubDate><guid>http://www.shnenglu.com/ccl0326/archive/2010/09/21/127247.html</guid><wfw:comment>http://www.shnenglu.com/ccl0326/comments/127247.html</wfw:comment><comments>http://www.shnenglu.com/ccl0326/archive/2010/09/21/127247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ccl0326/comments/commentRss/127247.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ccl0326/services/trackbacks/127247.html</trackback:ping><description><![CDATA[POSIX threads(綆縐癙threads)鏄湪澶氭牳騫沖彴涓婅繘琛屽茍琛岀紪紼嬬殑涓濂楀父鐢ㄧ殑API銆傜嚎紼嬪悓姝?Thread Synchronization)鏄茍琛岀紪紼嬩腑闈炲父閲嶈鐨勯氳鎵嬫錛屽叾涓渶鍏稿瀷鐨勫簲鐢ㄥ氨鏄敤Pthreads鎻愪緵鐨勯攣鏈哄埗(lock)鏉ュ澶氫釜綰跨▼涔嬮棿鍏?浜殑涓寸晫鍖?Critical Section)榪涜淇濇姢(鍙︿竴縐嶅父鐢ㄧ殑鍚屾鏈哄埗鏄痓arrier)銆?br><br>Pthreads鎻愪緵浜嗗縐嶉攣鏈哄埗錛?br>(1) Mutex錛堜簰鏂ラ噺錛夛細pthread_mutex_***<br>(2) Spin lock錛堣嚜鏃嬮攣錛夛細pthread_spin_***<br>(3) Condition Variable錛堟潯浠跺彉閲忥級錛歱thread_con_***<br>(4) Read/Write lock錛堣鍐欓攣錛夛細pthread_rwlock_***<br><br>Pthreads鎻愪緵鐨凪utex閿佹搷浣滅浉鍏崇殑API涓昏鏈夛細<br>pthread_mutex_lock (pthread_mutex_t *mutex);<br>pthread_mutex_trylock (pthread_mutex_t *mutex);<br>pthread_mutex_unlock (pthread_mutex_t *mutex);<br><br>Pthreads鎻愪緵鐨勪笌Spin Lock閿佹搷浣滅浉鍏崇殑API涓昏鏈夛細<br>pthread_spin_lock (pthread_spinlock_t *lock);<br>pthread_spin_trylock (pthread_spinlock_t *lock);<br>pthread_spin_unlock (pthread_spinlock_t *lock);<br><br>浠庡疄鐜板師鐞嗕笂鏉ヨ錛孧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><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><br>閭d箞鍦ㄥ疄闄呯紪紼嬩腑mutex鍜宻pin lcok鍝釜鐨勬ц兘鏇村ソ鍛紵鎴戜滑鐭ラ亾spin lock鍦↙inux鍐呮牳涓湁闈炲父騫挎硾鐨勫埄鐢紝閭d箞榪欐槸涓嶆槸璇存槑spin lock鐨勬ц兘鏇村ソ鍛紵涓嬮潰璁╂垜浠潵鐢ㄥ疄闄呯殑浠g爜嫻嬭瘯涓涓嬶紙璇風‘淇濅綘鐨勭郴緇熶腑宸茬粡瀹夎浜嗘渶榪戠殑g++錛夈?br><br>鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?01 // Name: spinlockvsmutex1.cc  <br><br>002 // Source: [url]http://www.alexonlinux.com/pthread-mutex-vs-pthread-spinlock[/url]  <br><br>003 // Compiler(<FONT style="BACKGROUND-COLOR: #00ffff">spin lock</FONT> version): g++ -o spin_version -DUSE_SPINLOCK spinlockvsmutex1.cc -lpthread  <br><br>004 // Compiler(mutex version): g++ -o mutex_version spinlockvsmutex1.cc -lpthread  <br><br>005 #include <stdio.h>  <br><br>006 #include <unistd.h>  <br><br>007 #include <sys/syscall.h>  <br><br>008 #include <errno.h>  <br><br>009 #include <sys/time.h>  <br><br>010 #include <list>  <br><br>011 #include <pthread.h>  <br><br>012    <br><br>013 #define LOOPS 50000000  <br><br>014    <br><br>015 using namespace std;  <br><br>016    <br><br>017 list<int> the_list;  <br><br>018    <br><br>019 #ifdef USE_SPINLOCK  <br><br>020 pthread_spinlock_t spinlock;  <br><br>021 #else  <br><br>022 pthread_mutex_t mutex;  <br><br>023 #endif  <br><br>024    <br><br>025 //Get the thread id  <br><br>026 pid_t gettid() { return syscall( __NR_gettid ); }  <br><br>027    <br><br>028 void *consumer(void *ptr)  <br><br>029 {  <br><br>030     int i;  <br><br>031    <br><br>032     printf("Consumer TID %lun", (unsigned long)gettid());  <br><br>033    <br><br>034     while (1)  <br><br>035     {  <br><br>036 #ifdef USE_SPINLOCK  <br><br>037         pthread_spin_lock(&spinlock);  <br><br>038 #else  <br><br>039         pthread_mutex_lock(&mutex);  <br><br>040 #endif  <br><br>041    <br><br>042         if (the_list.empty())  <br><br>043         {  <br><br>044 #ifdef USE_SPINLOCK  <br><br>045             pthread_spin_unlock(&spinlock);  <br><br>046 #else  <br><br>047             pthread_mutex_unlock(&mutex);  <br><br>048 #endif  <br><br>049             break;  <br><br>050         }  <br><br>051    <br><br>052         i = the_list.front();  <br><br>053         the_list.pop_front();  <br><br>054    <br><br>055 #ifdef USE_SPINLOCK  <br><br>056         pthread_spin_unlock(&spinlock);  <br><br>057 #else  <br><br>058         pthread_mutex_unlock(&mutex);  <br><br>059 #endif  <br><br>060     }  <br><br>061    <br><br>062     return NULL;  <br><br>063 }  <br><br>064    <br><br>065 int main()  <br><br>066 {  <br><br>067     int i;  <br><br>068     pthread_t thr1, thr2;  <br><br>069     struct timeval tv1, tv2;  <br><br>070    <br><br>071 #ifdef USE_SPINLOCK  <br><br>072     pthread_spin_init(&spinlock, 0);  <br><br>073 #else  <br><br>074     pthread_mutex_init(&mutex, NULL);  <br><br>075 #endif  <br><br>076    <br><br>077     // Creating the list content...  <br><br>078     for (i = 0; i < LOOPS; i++)  <br><br>079         the_list.push_back(i);  <br><br>080    <br><br>081     // Measuring time before starting the threads...  <br><br>082     gettimeofday(&tv1, NULL);  <br><br>083    <br><br>084     pthread_create(&thr1, NULL, consumer, NULL);  <br><br>085     pthread_create(&thr2, NULL, consumer, NULL);  <br><br>086    <br><br>087     pthread_join(thr1, NULL);  <br><br>088     pthread_join(thr2, NULL);  <br><br>089    <br><br>090     // Measuring time after threads finished...  <br><br>091     gettimeofday(&tv2, NULL);  <br><br>092    <br><br>093     if (tv1.tv_usec > tv2.tv_usec)  <br><br>094     {  <br><br>095         tv2.tv_sec--;  <br><br>096         tv2.tv_usec += 1000000;  <br><br>097     }  <br><br>098    <br><br>099     printf("Result - %ld.%ldn", tv2.tv_sec - tv1.tv_sec,  <br><br>100         tv2.tv_usec - tv1.tv_usec);  <br><br>101    <br><br>102 #ifdef USE_SPINLOCK  <br><br>103     pthread_spin_destroy(&spinlock);  <br><br>104 #else  <br><br>105     pthread_mutex_destroy(&mutex);  <br><br>106 #endif  <br><br>107    <br><br>108     return 0;  <br><br>109 } <br><br>璇ョ▼搴忚繍琛岃繃紼嬪涓嬶細涓葷嚎紼嬪厛鍒濆鍖栦竴涓猯ist緇撴瀯錛屽茍鏍規嵁LOOPS鐨勫煎皢瀵瑰簲鏁伴噺鐨別ntry鎻掑叆璇ist錛屼箣鍚庡垱寤轟袱涓柊綰跨▼錛屽畠浠兘鎵цconsumer()榪欎釜浠誨姟銆備袱涓鍒涘緩鐨勬柊綰跨▼鍚屾椂瀵硅繖涓猯ist榪涜pop鎿嶄綔銆備富綰跨▼浼氳綆椾粠鍒涘緩涓や釜鏂扮嚎紼嬪埌涓や釜鏂扮嚎紼嬬粨鏉熶箣闂存墍鐢ㄧ殑鏃墮棿錛岃緭鍑轟負涓嬫枃涓殑”Result “銆?br><br>嫻嬭瘯鏈哄櫒鍙傛暟錛?br>Ubuntu 9.04 X86_64<br>Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz<br>4.0 GB Memory<br><br>浠庝笅闈㈡槸嫻嬭瘯緇撴灉錛?br><br>鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?1 pxcwan@pxcwan-desktop:~/Workspace/mutex$ g++ -o spin_version -DUSE_SPINLOCK spinvsmutex1.cc -lpthread  <br><br>02 pxcwan@pxcwan-desktop:~/Workspace/mutex$ g++ -o mutex_version spinvsmutex1.cc -lpthread  <br><br>03 pxcwan@pxcwan-desktop:~/Workspace/mutex$ time ./spin_version  <br><br>04 Consumer TID 5520  <br><br>05 Consumer TID 5521  <br><br>06 Result - 5.888750  <br><br>07    <br><br>08 real    0m10.918s  <br><br>09 user    0m15.601s  <br><br>10 sys    0m0.804s  <br><br>11    <br><br>12 pxcwan@pxcwan-desktop:~/Workspace/mutex$ time ./mutex_version  <br><br>13 Consumer TID 5691  <br><br>14 Consumer TID 5692  <br><br>15 Result - 9.116376  <br><br>16    <br><br>17 real    0m14.031s  <br><br>18 user    0m12.245s  <br><br>19 sys    0m4.368s <br><br>鍙互鐪嬭spin lock鐨勭増鏈湪璇ョ▼搴忎腑琛ㄧ幇鍑烘潵鐨勬ц兘鏇村ソ銆傚彟澶栧煎緱娉ㄦ剰鐨勬槸sys鏃墮棿錛宮utex鐗堟湰鑺辮垂浜嗘洿澶氱殑緋葷粺璋冪敤鏃墮棿錛岃繖灝辨槸鍥犱負mutex浼氬湪閿佸啿紿佹椂璋冪敤system wait閫犳垚鐨勩?br><br>浣嗘槸錛屾槸涓嶆槸璇磗pin lock灝變竴瀹氭洿濂戒簡鍛紵璁╂垜浠啀鏉ョ湅涓涓攣鍐茬獊紼嬪害闈炲父鍓х儓鐨勫疄渚嬬▼搴忥細<br><br>鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?1 //Name: svm2.c  <br><br>02 //Source: [url]http://www.solarisinternals.com/wiki/index.php/DTrace_Topics_Locks[/url]  <br><br>03 //Compile(<FONT style="BACKGROUND-COLOR: #00ffff">spin lock</FONT> version): gcc -o spin -DUSE_SPINLOCK svm2.c -lpthread  <br><br>04 //Compile(mutex version): gcc -o mutex svm2.c -lpthread  <br><br>05 #include <stdio.h>  <br><br>06 #include <stdlib.h>  <br><br>07 #include <pthread.h>  <br><br>08 #include <sys/syscall.h>  <br><br>09    <br><br>10 #define        THREAD_NUM     2  <br><br>11    <br><br>12 pthread_t g_thread[THREAD_NUM];  <br><br>13 #ifdef USE_SPINLOCK  <br><br>14 pthread_spinlock_t g_spin;  <br><br>15 #else  <br><br>16 pthread_mutex_t g_mutex;  <br><br>17 #endif  <br><br>18 __uint64_t g_count;  <br><br>19    <br><br>20 pid_t gettid()  <br><br>21 {  <br><br>22     return syscall(SYS_gettid);  <br><br>23 }  <br><br>24    <br><br>25 void *run_amuck(void *arg)  <br><br>26 {  <br><br>27        int i, j;  <br><br>28    <br><br>29        printf("Thread %lu started.n", (unsigned long)gettid());  <br><br>30    <br><br>31        for (i = 0; i < 10000; i++) {  <br><br>32 #ifdef USE_SPINLOCK  <br><br>33            pthread_spin_lock(&g_spin);  <br><br>34 #else  <br><br>35                pthread_mutex_lock(&g_mutex);  <br><br>36 #endif  <br><br>37                for (j = 0; j < 100000; j++) {  <br><br>38                        if (g_count++ == 123456789)  <br><br>39                                printf("Thread %lu wins!n", (unsigned long)gettid());  <br><br>40                }  <br><br>41 #ifdef USE_SPINLOCK  <br><br>42            pthread_spin_unlock(&g_spin);  <br><br>43 #else  <br><br>44                pthread_mutex_unlock(&g_mutex);  <br><br>45 #endif  <br><br>46        }  <br><br>47    <br><br>48        printf("Thread %lu finished!n", (unsigned long)gettid());  <br><br>49    <br><br>50        return (NULL);  <br><br>51 }  <br><br>52    <br><br>53 int main(int argc, char *argv[])  <br><br>54 {  <br><br>55        int i, threads = THREAD_NUM;  <br><br>56    <br><br>57        printf("Creating %d threads...n", threads);  <br><br>58 #ifdef USE_SPINLOCK  <br><br>59        pthread_spin_init(&g_spin, 0);  <br><br>60 #else  <br><br>61        pthread_mutex_init(&g_mutex, NULL);  <br><br>62 #endif  <br><br>63        for (i = 0; i < threads; i++)  <br><br>64                pthread_create(&g_thread[i], NULL, run_amuck, (void *) i);  <br><br>65    <br><br>66        for (i = 0; i < threads; i++)  <br><br>67                pthread_join(g_thread[i], NULL);  <br><br>68    <br><br>69        printf("Done.n");  <br><br>70    <br><br>71        return (0);  <br><br>72 } <br><br>榪欎釜紼嬪簭鐨勭壒寰佸氨鏄復鐣屽尯闈炲父澶э紝榪欐牱涓や釜綰跨▼鐨勯攣绔炰簤浼氶潪甯哥殑鍓х儓銆傚綋鐒惰繖涓槸涓涓瀬绔儏鍐碉紝瀹為檯搴旂敤紼嬪簭涓復鐣屽尯涓嶄細濡傛澶э紝閿佺珵浜変篃涓嶄細濡傛嬋鐑堛傛祴璇曠粨鏋滄樉紺簃utex鐗堟湰鎬ц兘鏇村ソ錛?br><br>鏌ョ湅婧愪唬鐮佹墦鍗板府鍔?1 pxcwan@pxcwan-desktop:~/Workspace/mutex$ time ./spin  <br><br>02 Creating 2 threads...  <br><br>03 Thread 31796 started.  <br><br>04 Thread 31797 started.  <br><br>05 Thread 31797 wins!  <br><br>06 Thread 31797 finished!  <br><br>07 Thread 31796 finished!  <br><br>08 Done.  <br><br>09    <br><br>10 real    0m5.748s  <br><br>11 user    0m10.257s  <br><br>12 sys    0m0.004s  <br><br>13    <br><br>14 pxcwan@pxcwan-desktop:~/Workspace/mutex$ time ./mutex  <br><br>15 Creating 2 threads...  <br><br>16 Thread 31801 started.  <br><br>17 Thread 31802 started.  <br><br>18 Thread 31802 wins!  <br><br>19 Thread 31802 finished!  <br><br>20 Thread 31801 finished!  <br><br>21 Done.  <br><br>22    <br><br>23 real    0m4.823s  <br><br>24 user    0m4.772s  <br><br>25 sys    0m0.032s <br><br>鍙﹀涓涓煎緱娉ㄦ剰鐨勭粏鑺傛槸spin lock鑰楄垂浜嗘洿澶氱殑user time銆傝繖灝辨槸鍥犱負涓や釜綰跨▼鍒嗗埆榪愯鍦ㄤ袱涓牳涓婏紝澶ч儴鍒嗘椂闂村彧鏈変竴涓嚎紼嬭兘鎷垮埌閿侊紝鎵浠ュ彟涓涓嚎紼嬪氨涓鐩村湪瀹冭繍琛岀殑core涓婅繘琛屽繖絳夊緟錛孋PU鍗犵敤鐜囦竴鐩存槸100%錛涜宮utex鍒欎笉鍚岋紝褰撳閿佺殑璇鋒眰澶辮觸鍚庝笂涓嬫枃鍒囨崲灝變細鍙戠敓錛岃繖鏍峰氨鑳界┖鍑轟竴涓牳鏉ヨ繘琛屽埆鐨勮繍綆椾換鍔′簡銆傦紙鍏跺疄榪欑涓婁笅鏂囧垏鎹㈠宸茬粡鎷跨潃閿佺殑閭d釜綰跨▼鎬ц兘涔熸槸鏈夊獎鍝嶇殑錛屽洜涓哄綋璇ョ嚎紼嬮噴鏀捐閿佹椂瀹冮渶瑕侀氱煡鎿嶄綔緋葷粺鍘誨敜閱掗偅浜涜闃誨鐨勭嚎紼嬶紝榪欎篃鏄澶栫殑寮閿錛?br><br>鎬葷粨<br>錛?錛塎utex閫傚悎瀵歸攣鎿嶄綔闈炲父棰戠箒鐨勫満鏅紝騫朵笖鍏鋒湁鏇村ソ鐨勯傚簲鎬с傚敖綆$浉姣攕pin lock瀹冧細鑺辮垂鏇村鐨勫紑閿錛堜富瑕佹槸涓婁笅鏂囧垏鎹級錛屼絾鏄畠鑳介傚悎瀹為檯寮鍙戜腑澶嶆潅鐨勫簲鐢ㄥ満鏅紝鍦ㄤ繚璇佷竴瀹氭ц兘鐨勫墠鎻愪笅鎻愪緵鏇村ぇ鐨勭伒媧誨害銆?br><br>錛?錛塻pin lock鐨刲ock/unlock鎬ц兘鏇村ソ(鑺辮垂鏇村皯鐨刢pu鎸囦護)錛屼絾鏄畠鍙傚簲鐢ㄤ簬涓寸晫鍖鴻繍琛屾椂闂村緢鐭殑鍦烘櫙銆傝屽湪瀹為檯杞歡寮鍙戜腑錛岄櫎闈炵▼搴忓憳瀵硅嚜宸辯殑紼嬪簭鐨勯攣鎿嶄綔琛屼負闈炲父鐨勪簡瑙o紝鍚﹀垯浣跨敤spin lock涓嶆槸涓涓ソ涓繪剰(閫氬父涓涓綰跨▼紼嬪簭涓閿佺殑鎿嶄綔鏈夋暟浠ヤ竾嬈★紝濡傛灉澶辮觸鐨勯攣鎿嶄綔(contended lock requests)榪囧鐨勮瘽灝變細嫻垂寰堝鐨勬椂闂磋繘琛岀┖絳夊緟)銆?br><br>錛?錛夋洿淇濋櫓鐨勬柟娉曟垨璁告槸鍏堬紙淇濆畧鐨勶級浣跨敤 Mutex錛岀劧鍚庡鏋滃鎬ц兘榪樻湁榪涗竴姝ョ殑闇姹傦紝鍙互灝濊瘯浣跨敤spin lock榪涜璋冧紭銆傛瘯绔熸垜浠殑紼嬪簭涓嶅儚Linux kernel閭f牱瀵規ц兘闇姹傞偅涔堥珮(Linux Kernel鏈甯哥敤鐨勯攣鎿嶄綔鏄痵pin lock鍜宺w lock)銆?br><br>2010騫?鏈?鏃ヨˉ璁幫細榪欎釜瑙傜偣鍦∣racle鐨勬枃妗d腑寰楀埌浜嗘敮鎸侊細<br><br>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. <br><br>p.s.璋冪敤syscall(SYS_gettid)鍜宻yscall( __NR_gettid )閮藉彲浠ュ緱鍒板綋鍓嶇嚎紼嬬殑id:)<br><br>杞澆璇鋒敞鏄庢潵鑷? [url]www.parallellabs.com[/url]<br>------------------------------------------------------------------------------<br><br>spinlock涓巐inux鍐呮牳璋冨害鐨勫叧緋?br><br><br>銆銆浣滆咃細鍒樻椽娑涳紝鍗庢竻榪滆宓屽叆寮忓煿璁腑蹇冮珮綰ц甯堬紝ARM鍏徃鎺堟潈ATC璁插笀銆?br><br>騫垮憡鎻掓挱淇℃伅<br>緇村簱鏈鏂扮儹鍗栬姱鐗囷細<br><br>銆銆鍏充簬鑷棆閿佺敤娉曚粙緇嶇殑鏂囩珷錛屽凡緇忔湁寰堝錛屼絾鏈変簺緇嗚妭鐨勫湴鏂圭偣鐨勮繕涓嶅閫忋傛垜榪欓噷灝辨妸鎴戜釜浜鴻涓哄ぇ瀹跺鏄撴湁鐤戦棶鐨勫湴鏂規嬁鍑烘潵璁ㄨ涓涓嬨?br><br>銆銆涓銆佽嚜鏃嬮攣錛坰pinlock錛夌畝浠?br><br>銆銆鑷棆閿佸湪鍚屼竴鏃跺埢鍙兘琚渶澶氫竴涓唴鏍鎬換鍔℃寔鏈夛紝鎵浠ヤ竴涓椂鍒誨彧鏈変竴涓嚎紼嬪厑璁稿瓨鍦ㄤ簬涓寸晫鍖轟腑銆傝繖鐐瑰彲浠ュ簲鐢ㄥ湪澶氬鐞嗘満鍣ㄣ佹垨榪愯鍦ㄥ崟澶勭悊鍣ㄤ笂鐨勬姠鍗犲紡鍐呮牳涓渶瑕佺殑閿佸畾鏈嶅姟銆?br><br>銆銆浜屻佷俊鍙烽噺綆浠?br><br>銆銆榪欓噷涔熶粙緇嶄笅淇″彿閲忕殑姒傚康錛屽洜涓哄畠鐨勭敤娉曞拰鑷棆閿佹湁鐩鎬技鐨勫湴鏂廣?br><br>銆銆Linux涓殑淇″彿閲忔槸涓縐嶇潯鐪犻攣銆傚鏋滄湁涓涓換鍔¤瘯鍥捐幏寰椾竴涓凡琚寔鏈夌殑淇″彿閲忔椂錛屼俊鍙烽噺浼氬皢鍏舵帹鍏ョ瓑寰呴槦鍒楋紝鐒跺悗璁╁叾鐫$湢銆傝繖鏃跺鐞嗗櫒鑾峰緱鑷敱鍘繪墽琛屽叾瀹冧唬鐮併傚綋鎸佹湁淇″彿閲忕殑榪涚▼灝嗕俊鍙烽噺閲婃斁鍚庯紝鍦ㄧ瓑寰呴槦鍒椾腑鐨勪竴涓換鍔″皢琚敜閱掞紝浠庤屼究鍙互鑾峰緱榪欎釜淇″彿閲忋?br><br>銆銆涓夈佽嚜鏃嬮攣鍜屼俊鍙烽噺瀵規瘮<br><br>銆銆鍦ㄥ緢澶氬湴鏂硅嚜鏃嬮攣鍜屼俊鍙烽噺鍙互閫夋嫨浠諱綍涓涓嬌鐢紝浣嗕篃鏈変竴浜涘湴鏂瑰彧鑳介夋嫨鏌愪竴縐嶃備笅闈㈠姣斾竴浜涗袱鑰呯殑鐢ㄦ硶銆?br><br>銆銆琛?-1鑷棆閿佸拰淇″彿閲忓姣?br><br><br><br><br><br><br><br><br><br><br>銆銆鍥涖佽嚜鏃嬮攣涓巐inux鍐呮牳榪涚▼璋冨害鍏崇郴<br><br>銆銆鎴戜滑璁ㄨ涓嬭〃1-1涓殑絎?縐嶆儏鍐碉紙鍏跺畠鍑犵鎯呭喌姣旇緝濂界悊瑙o級錛屽鏋滀復鐣屽尯鍙兘鍖呭惈寮曡搗鐫$湢鐨勪唬鐮佸垯涓嶈兘浣跨敤鑷棆閿侊紝鍚﹀垯鍙兘寮曡搗姝婚攣銆?br><br>銆銆閭d箞涓轟粈涔堜俊鍙烽噺淇濇姢鐨勪唬鐮佸彲浠ョ潯鐪犺岃嚜鏃嬮攣灝變笉鑳藉憿錛?br><br>銆銆鍏堢湅涓嬭嚜鏃嬮攣鐨勫疄鐜版柟娉曞惂錛岃嚜鏃嬮攣鐨勫熀鏈艦寮忓涓嬶細<br><br>銆銆spin_lock(&mr_lock);<br><br>銆銆//涓寸晫鍖?br><br>銆銆spin_unlock(&mr_lock);<br><br>銆銆璺熻釜涓涓媠pin_lock(&mr_lock)鐨勫疄鐜?br><br>銆銆#define spin_lock(lock) _spin_lock(lock)<br><br>銆銆#define _spin_lock(lock) __LOCK(lock)<br><br>銆銆#define __LOCK(lock) \<br><br>銆銆do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)<br><br>銆銆娉ㄦ剰鍒?#8220;preempt_disable()”錛岃繖涓皟鐢ㄧ殑鍔熻兘鏄?#8220;鍏蟲姠鍗?#8221;錛堝湪spin_unlock涓細閲嶆柊寮鍚姠鍗犲姛鑳斤級銆備粠涓彲浠ョ湅鍑猴紝浣跨敤鑷棆閿佷繚鎶ょ殑鍖哄煙鏄伐浣滃湪闈炴姠鍗犵殑鐘舵侊紱鍗充嬌鑾峰彇涓嶅埌閿侊紝鍦?#8220;鑷棆”鐘舵佷篃鏄姝㈡姠鍗犵殑銆備簡瑙e埌榪欙紝鎴戞兂鍜變滑搴旇鑳藉鐞嗚В涓轟綍鑷棆閿佷繚鎶ょ殑浠g爜涓嶈兘鐫$湢浜嗐傝瘯鎯充竴涓嬶紝濡傛灉鍦ㄨ嚜鏃嬮攣淇濇姢鐨勪唬鐮佷腑闂寸潯鐪狅紝姝ゆ椂鍙戠敓榪涚▼璋冨害錛屽垯鍙兘鍙﹀涓涓繘紼嬩細鍐嶆璋冪敤spinlock淇濇姢鐨勮繖孌典唬鐮併傝屾垜浠幇鍦ㄧ煡閬撲簡鍗充嬌鍦ㄨ幏鍙栦笉鍒伴攣鐨?#8220;鑷棆”鐘舵侊紝涔熸槸紱佹鎶㈠崰鐨勶紝鑰?#8220;鑷棆”鍙堟槸鍔ㄦ佺殑錛屼笉浼氬啀鐫$湢浜嗭紝涔熷氨鏄鍦ㄨ繖涓鐞嗗櫒涓婁笉浼氬啀鏈夎繘紼嬭皟搴﹀彂鐢熶簡錛岄偅涔堟閿佽嚜鐒跺氨鍙戠敓浜嗐?br><br>銆銆鍜變滑鍙互鎬葷粨涓嬭嚜鏃嬮攣鐨勭壒鐐癸細<br><br>銆銆鈼?鍗曞鐞嗗櫒闈炴姠鍗犲唴鏍鎬笅錛氳嚜鏃嬮攣浼氬湪緙栬瘧鏃惰蹇界暐錛?br><br>銆銆鈼?鍗曞鐞嗗櫒鎶㈠崰鍐呮牳涓嬶細鑷棆閿佷粎浠呭綋浣滀竴涓緗唴鏍告姠鍗犵殑寮鍏籌紱<br><br>銆銆鈼?澶氬鐞嗗櫒涓嬶細姝ゆ椂鎵嶈兘瀹屽叏鍙戞尌鍑鴻嚜鏃嬮攣鐨勪綔鐢紝鑷棆閿佸湪鍐呮牳涓富瑕佺敤鏉ラ槻姝㈠澶勭悊鍣ㄤ腑騫跺彂璁塊棶涓寸晫鍖猴紝闃叉鍐呮牳鎶㈠崰閫犳垚鐨勭珵浜夈?br><br>銆銆浜斻乴inux鎶㈠崰鍙戠敓鐨勬椂闂?br><br>銆銆鏈鍚庡湪浜嗚В涓媗inux鎶㈠崰鍙戠敓鐨勬椂闂達紝鎶㈠崰鍒嗕負鐢ㄦ埛鎶㈠崰鍜屽唴鏍告姠鍗犮?br><br>銆銆鐢ㄦ埛鎶㈠崰鍦ㄤ互涓嬫儏鍐典笅浜х敓錛?br><br>銆銆鈼?浠庣郴緇熻皟鐢ㄨ繑鍥炵敤鎴風┖闂?br><br>銆銆鈼?浠庝腑鏂鐞嗙▼搴忚繑鍥炵敤鎴風┖闂?br><br>銆銆鍐呮牳鎶㈠崰浼氬彂鐢熷湪錛?br><br>銆銆鈼?褰撲粠涓柇澶勭悊紼嬪簭榪斿洖鍐呮牳絀洪棿鐨勬椂鍊欙紝涓斿綋鏃跺唴鏍稿叿鏈夊彲鎶㈠崰鎬э紱<br><br>銆銆鈼?褰撳唴鏍鎬唬鐮佸啀涓嬈″叿鏈夊彲鎶㈠崰鎬х殑鏃跺欍傦紙濡?spin_unlock鏃訛級<br><br>銆銆鈼?濡傛灉鍐呮牳涓殑浠誨姟鏄懼紡鐨勮皟鐢╯chedule()<br><br>銆銆鈼?濡傛灉鍐呮牳涓殑浠誨姟闃誨銆?br><br>銆銆鍩烘湰鐨勮繘紼嬭皟搴﹀氨鏄彂鐢熷湪鏃墮挓涓柇鍚庯紝騫朵笖鍙戠幇榪涚▼鐨勬椂闂寸墖宸茬粡浣跨敤瀹屼簡錛屽垯鍙戠敓榪涚▼鎶㈠崰銆傞氬父鎴戜滑浼氬埄鐢ㄤ腑鏂鐞嗙▼搴忚繑鍥炲唴鏍哥┖闂寸殑鏃跺欏彲浠ヨ繘琛屽唴鏍告姠鍗犺繖涓壒鎬ф潵鎻愰珮涓浜汭/O鎿嶄綔鐨勫疄鏃舵э紝濡傦細褰揑/O浜嬩歡鍙戠敓鐨勬槸鏃跺欙紝瀵瑰簲鐨勪腑鏂鐞嗙▼搴忚嬋媧伙紝褰撳畠鍙戠幇鏈夎繘紼嬪湪絳夊緟榪欎釜I/O浜嬩歡鐨勬椂鍊欙紝瀹冧細嬋媧葷瓑寰呰繘紼嬶紝騫朵笖璁劇疆褰撳墠姝e湪鎵ц榪涚▼鐨刵eed_resched鏍囧織錛岃繖鏍峰湪涓柇澶勭悊紼嬪簭榪斿洖鐨勬椂鍊欙紝璋冨害紼嬪簭琚縺媧伙紝鍘熸潵鍦ㄧ瓑寰匢/O浜嬩歡鐨勮繘紼嬶紙寰堝彲鑳斤級鑾峰緱鎵ц鏉冿紝浠庤屼繚璇佷簡瀵笽/O浜嬩歡鐨勭浉瀵瑰揩閫熷搷搴旓紙姣綰э級銆傚彲浠ョ湅鍑猴紝鍦↖/O浜嬩歡鍙戠敓鐨勬椂鍊欙紝I/O浜嬩歡鐨勫鐞嗚繘紼嬩細鎶㈠崰褰撳墠榪涚▼錛岀郴緇熺殑鍝嶅簲閫熷害涓庤皟搴︽椂闂寸墖鐨勯暱搴︽棤鍏熾?br> <img src ="http://www.shnenglu.com/ccl0326/aggbug/127247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ccl0326/" target="_blank">Vincent</a> 2010-09-21 15:15 <a href="http://www.shnenglu.com/ccl0326/archive/2010/09/21/127247.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>感谢您访问我们的网站,您可能还对以下资源感兴趣:</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.vcdordvd.cn" target="_blank">武侠古典久久婷婷狼人伊人</a>| <a href="http://www.dwhpg.com.cn" target="_blank"> 久久综合九色综合久99</a>| <a href="http://www.baifeng.net.cn" target="_blank">伊人色综合九久久天天蜜桃 </a>| <a href="http://www.ggfuns.cn" target="_blank">97久久国产综合精品女不卡</a>| <a href="http://www.h6cpi0.cn" target="_blank">久久伊人精品一区二区三区 </a>| <a href="http://www.lxldb.cn" target="_blank">久久91精品国产91久久麻豆 </a>| <a href="http://www.fmzz6688.cn" target="_blank">伊人久久综合精品无码AV专区</a>| <a href="http://www.tsz114.cn" target="_blank">91精品国产高清久久久久久io </a>| <a href="http://www.piaowutong.com.cn" target="_blank">精品一区二区久久久久久久网站</a>| <a href="http://www.ccqcyly.cn" target="_blank">久久99久久成人免费播放</a>| <a href="http://www.sh-jixiang.cn" target="_blank">国产精品久久久久久久久久影院</a>| <a href="http://www.s8322.cn" target="_blank">99国产精品久久</a>| <a href="http://www.hhyskj.com.cn" target="_blank">久久精品亚洲AV久久久无码</a>| <a href="http://www.baojingqi88.org.cn" target="_blank">日韩精品国产自在久久现线拍</a>| <a href="http://www.681lc.cn" target="_blank">日产精品久久久久久久</a>| <a href="http://www.yrjiameng.cn" target="_blank">中文字幕亚洲综合久久2</a>| <a href="http://www.90xueyuan.cn" target="_blank">欧洲精品久久久av无码电影</a>| <a href="http://www.ddmir.cn" target="_blank">亚洲国产成人久久综合碰</a>| <a href="http://www.sun-q.cn" target="_blank">青青青伊人色综合久久</a>| <a href="http://www.9xz.com.cn" target="_blank">久久久亚洲欧洲日产国码二区</a>| <a href="http://www.zheiwa.cn" target="_blank">亚洲精品成人网久久久久久</a>| <a href="http://www.npoq.cn" target="_blank">国产ww久久久久久久久久</a>| <a href="http://www.awcy.cn" target="_blank">91精品国产综合久久精品</a>| <a href="http://www.soba30.cn" target="_blank">久久久亚洲裙底偷窥综合</a>| <a href="http://www.paypaal.cn" target="_blank">亚洲伊人久久综合影院</a>| <a href="http://www.qilehu.cn" target="_blank">久久国产香蕉视频</a>| <a href="http://www.0731car.com.cn" target="_blank">精品无码人妻久久久久久</a>| <a href="http://www.338net.cn" target="_blank">亚洲成色999久久网站</a>| <a href="http://www.hbdmw.cn" target="_blank">国产精品一久久香蕉国产线看 </a>| <a href="http://www.231it.cn" target="_blank">亚洲国产美女精品久久久久∴ </a>| <a href="http://www.fylmbd.cn" target="_blank">久久这里只有精品首页</a>| <a href="http://www.zhangqiu114.cn" target="_blank">国内精品久久久久影院优 </a>| <a href="http://www.wenlitown.cn" target="_blank">精品久久久无码人妻中文字幕 </a>| <a href="http://www.jincheng365.cn" target="_blank">久久精品亚洲欧美日韩久久</a>| <a href="http://www.nfnv.cn" target="_blank">久久精品草草草</a>| <a href="http://www.top-cc.cn" target="_blank">国产精品日韩深夜福利久久</a>| <a href="http://www.syggzy.org.cn" target="_blank">人人狠狠综合久久亚洲婷婷</a>| <a href="http://www.liaojiaren.cn" target="_blank">久久精品国产精品青草app</a>| <a href="http://www.yuandanjie.cn" target="_blank">91精品国产9l久久久久</a>| <a href="http://www.369live.cn" target="_blank">久久婷婷久久一区二区三区</a>| <a href="http://www.20xjj.cn" target="_blank">色综合久久88色综合天天</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>