讀寫鎖與互斥鎖類似,不過讀寫鎖允許更高的並行性。讀寫鎖可以有三種狀態:(1) 讀模式下的加鎖狀態;(2)寫模式下的加鎖狀態(3)不加鎖狀態。這個區別與互斥鎖的,因為互斥鎖只有加鎖和不加鎖的兩種狀態。一次只能有乙個執行緒的寫狀態的讀寫鎖,但是可以有多個執行緒占有讀狀態的讀寫鎖。
#include
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
讀寫鎖通過呼叫pthread_rwlock_init進行初始化的,attr =null時使用預設的屬性。在釋放讀寫鎖占用的記憶體之前,需要呼叫pthread_rwlock_destroy函式做清理工作。
#include
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); //寫模式下的加鎖
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); //讀模式下的加鎖
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); //無論那種模式都可以用的解鎖
//使用讀寫鎖
#include #include struct job
;struct queue
;int queue_init(struct queue *qp)
return(0);
}void job_insert(struct queue *qp, struct job *jp)
else
qp->q_head = jp;
pthread_rwlock_unlock(&qp->q_lock);
} else
qp->q_tail = jp;
pthread_rwlock_unlock(&qp->q_lock);
}void job_remove(struct queue *qp,struct job *jp)
} else if(jp == qp->q_tail) }
else
pthread_rwlock_unlock(&qp->q_lock);
}struct job *job_find(struct queue *qp, pthread_t id)
for(jp = qp->q_head; jp != null; jp = ip->j_next) }
pthread_rwlock_unlock(&qp->q_lock);
return(jp);
}
Linux 執行緒 2(執行緒同步)筆記
二 讀寫鎖 三 條件變數 三 訊號量 同步即協同步調,按預定的先後順序執行 由於執行緒共享程序的資源和位址空間,當多個執行緒對同一共享資源進行操作時,為防止資料混亂,因此在對這些資源進行操作時,必須考慮到執行緒間資源訪問的同步和互斥的問題。這裡介紹 posix 中線程同步的方法,主要有互斥鎖 讀寫鎖...
Linux多執行緒程式設計(2)執行緒同步
執行緒同步 a.mutex 互斥量 多個執行緒同時訪問共享資料時可能會衝突,這跟前面講訊號時所說的可重要性是同樣的問 題。假如 兩個執行緒都要把某個全域性變數增加1,這個操作在某平台需要三條指令完成 1.從記憶體讀變數值到暫存器 2.暫存器的值加1 3.將暫存器的值寫回記憶體 我們通過乙個簡單的程式...
linux 執行緒 執行緒同步
因為執行緒獨自擁有的只有棧,其他的區域執行緒共同擁有。並且對共享區域的操作並不都是原子的。對共享區域的操作順序又是不確定的。就像建立兩個檔案描述符同時指向 同一檔案,並且連續向檔案中寫入那麼寫的東西可能是亂七八糟的。這時就需要執行緒對共享區的同步。而另一種情況是,多個執行緒的指令執行順序需要同步。這...