linux程式設計 執行緒 讀寫鎖

2021-08-07 07:42:04 字數 2231 閱讀 9634

讀寫鎖通訊機制

讀寫鎖分為讀鎖和寫鎖,功能如下

(1)如果某執行緒申請了讀鎖,其他執行緒可以再申請讀鎖,但不能申請寫鎖。

(2)如果某執行緒申請了寫鎖,則其他執行緒不能申請讀鎖,也不能申請寫鎖。

初始化讀寫鎖

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,

const pthread_rwlockattr_t *restrict attr);

銷毀讀寫鎖

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

申請讀鎖

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

申請寫鎖

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

解鎖int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

程式示例:

程式實現4個執行緒,兩個讀執行緒,兩個寫執行緒。

#include

#include

#include

#include

#include

#include

#include

static pthread_rwlock_t rwlock;

#define bufsize 1024

char gdata[bufsize];

int gtime;

void *thread_fun_read1(void*arg);

void *thread_fun_read2(void*arg);

void *thread_fun_write1(void*arg);

void *thread_fun_write2(void*arg);

int main(int argc,char* argv)

res = pthread_create(&th1,null,thread_fun_read1,null);

if(res != 0)

res = pthread_create(&th2,null,thread_fun_read2,null);

if(res != 0)

res = pthread_create(&th3,null,thread_fun_write1,null);

if(res != 0)

res = pthread_create(&th4,null,thread_fun_write2,null);

if(res != 0)

res = pthread_join(th1,&thret);

if(res != 0)

res = pthread_join(th2,&thret);

if(res != 0)

res = pthread_join(th3,&thret);

if(res != 0)

res = pthread_join(th4,&thret);

if(res != 0)

pthread_rwlock_destroy(&rwlock);

exit(0);        

}void *thread_fun_read1(void*arg)

}pthread_rwlock_unlock(&rwlock);

gtime = 1;

pthread_exit(0);    

}void *thread_fun_read2(void*arg)

}pthread_rwlock_unlock(&rwlock);

gtime = 1;

pthread_exit(0);    

}void *thread_fun_write1(void*arg)

pthread_rwlock_unlock(&rwlock);

pthread_exit(0);

}void *thread_fun_write2(void*arg)

pthread_rwlock_unlock(&rwlock);

pthread_exit(0);

}

Linux多執行緒程式設計之讀寫鎖

讀寫鎖也是執行緒同步中的一種同步機制,簡單的來說 讀寫鎖既有讀的方面也有寫的方面,其中讀是共享鎖,而寫是獨佔鎖,而且系統中讀寫鎖的分配是寫鎖優先的。下面的用例,證明了讀鎖是共享鎖。thread fun1中加了讀鎖,但並沒有解讀鎖 thread fun2中也可以加讀鎖執行 如果thread fun2中...

Linux多執行緒程式設計 利用讀寫鎖實現讀寫互斥

一次只有乙個執行緒可以占有寫模式的讀寫鎖,但是可以有多個執行緒同時占有讀模式的讀寫鎖,正是因為這個特性,當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞。通常,當讀寫鎖處於讀模式鎖住狀態時,如果有另外執行緒試圖以寫模式加鎖,讀寫鎖通常會阻塞隨後的讀模式鎖請求,這樣可...

Linux執行緒同步 讀寫鎖

讀寫鎖和互斥量 互斥鎖 很類似,是另一種執行緒同步機制,但不屬於posix標準,可以用來同步同一程序中的各個執行緒。當然如果乙個讀寫鎖存放在多個程序共享的某個記憶體區中,那麼還可以用來進行程序間的同步.和互斥量不同的是 互斥量會把試圖進入已保護的臨界區的執行緒都阻塞 然而讀寫鎖會視當前進入臨界區的執...