1. 程式人生 > >多執行緒的那點兒事(之順序鎖)

多執行緒的那點兒事(之順序鎖)

說明:本文轉自http://blog.csdn.net/feixiaoxing/article/details/7051346

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】


    在互斥資料訪問中有一種多讀少寫的情況。正對這麼一種情形,我們也提出了讀寫鎖的方案。但是呢,這個鎖有些缺陷。什麼缺陷呢?那就是,這個寫鎖需要在所有的讀鎖完成之後才能寫。否則的話,寫鎖需要這麼一直等下去。

    那麼,有沒有什麼辦法能使得寫操作快速一點進行呢?那就是順序鎖。

  1. typedefstruct _SEQUENCE_LOCK  
  2. {  
  3.     unsigned int
     sequence;  
  4.     HANDLE hLock;  
  5. }SEQUENCE_LOCK;  
    有了這麼一個數據結構之後。那麼讀鎖怎麼開始呢,
  1. unsigned int get_lock_begin(SEQUENCE_LOCK* hSeqLock)  
  2. {  
  3.     assert(NULL != hSeqLock);  
  4.     return hSeqLock->sequence;      
  5. }     
  6. int get_lock_retry(SEQUENCE_LOCK* hSeqLock, unsigned int value)  
  7. {  
  8.     unsigned int
     new_value;  
  9.     assert(NULL != hSeqLock);  
  10.     new_value = hSeqLock->sequence;  
  11.     return (new_value & 0x1) || (new_value ^ value);      
  12. }  
    自然寫鎖也需要修改了,
  1. void get_write_lock(SEQUENCE_LOCK* hSeqLock)  
  2. {  
  3.     assert(NULL != hSeqLock);  
  4.     WaitForSingleObject(hSeqLock->hLock);  
  5.     hSeqLock->sequence ++;  
  6. }   
  7. void release_write_lock(SEQUENCE_LOCK* hSeqLock)  
  8. {  
  9.     assert(NULL != hSeqLock);  
  10.     hSeqLock->sequence ++;  
  11.     ReleaseMutex(hSeqLock->hLock);  
  12. }  
    如果應用呢,其實也不難,
  1. void read_process(SEQUENCE_LOCK* hSeqLock)  
  2. {  
  3.     unsigned int sequence;  
  4.     do{  
  5.        sequence = get_lock_begin(hSeqLock);  
  6.        /* read operation  */
  7.     }while(get_lock_retry(hSeqLock, sequence));  
  8. }  
  9. void write_process(SEQUENCCE_LOCK* hSeqLock)  
  10. {  
  11.     get_write_lock(hSeqLock);  
  12.     /* write operation */
  13.     release_write_lock(hSeqLock);  
  14. }  

總結:
    (1)讀鎖退出有兩個條件,要麼寫操作正在進行呢,要麼沒有寫鎖

    (2)寫鎖之間需要互斥操作

    (3)互斥操作的資料不能是指標,否則有可能在訪問的時候會造成異常,因為有可能邊寫邊讀

    (4)順序鎖代替不了讀寫鎖,因為讀寫鎖可以保證所有的資料操作,而順序鎖不行