讀寫鎖用於讀取資料比修改資料更頻繁的場景,它的分配規則如下:
1.沒有執行緒持有寫鎖時,任意多的執行緒可以持有讀鎖。
2.僅當沒有執行緒持有讀鎖或寫鎖時,才能分配寫鎖。
當已有執行緒持有讀鎖時,另一線程申請寫鎖則會阻塞,若後續還有讀鎖的申請,此時有兩種策略:
1.對後續的讀鎖請求都通過,可能會造成因讀鎖不斷被分配,寫鎖申請始終阻塞,「餓死」了寫程序。
3.後續讀鎖請求都阻塞,等當前持有的讀鎖都結束後優先分配寫鎖。
讀寫鎖的靜態分配可用
pthread_rwlock_initializer
,動態分配用
pthread_rwlock_init
初始化,它的屬性也是
pthread_process_private
或pthread_process_shared
,也需要對應型別的屬性物件。讀寫鎖的
init
和destroy
要結對使用,
pthread_rwlockattr_t
屬性物件也同樣。
pthread_rwlock_rdlock
:阻塞模式申請讀鎖。
pthread_rwlock_wrlock
:阻塞模式申請寫鎖。
pthread_rwlock_tryrdlock
:非阻塞模式申請讀鎖。
pthread_rwlock_tryrdlock
:非阻塞模式申請讀鎖。
pthread_rwlock_unlock
:解鎖。
記錄上鎖是讀寫鎖的一種擴充套件型別,它可用於任意兩個程序間共享某檔案的讀和寫。執行上鎖的函式是
fcntl
,鎖由核心維護,其屬主由程序
id標識。
unix
核心沒有記錄這一概念,對記錄的解釋是由讀寫檔案的應用進行的。每個記錄就是檔案中的乙個位元組範圍。
posix
記錄上鎖的粒度是單個位元組,粒度越小,允許同時使用的使用者數就越多。
int fcntl(int fd, int cmd, .../* struct flock *arg*/);
fcntl
函式的cmd
1.f_setlk
獲取或釋放指定的鎖,若無法完成該操作則返回出錯而不阻塞。
2.f_setlkw
阻塞版本的
f_setlk。3.
f_getlk
檢查arg
指向的鎖是否與某個已存在的鎖衝突。
f_getlk
後緊接著
f_setlk
不是原子操作。
fcntl
不能對唯讀開啟的檔案獲取寫鎖,也不能對只寫開啟的檔案獲取讀鎖。
鎖住整個檔案的兩個方式:
1.l_whence
成員為seek_set,l_start
的成員為0,
l_len
成員為0。2.
用lseek
把讀寫指標放到檔案頭,然後令
l_whence
為seek_set,l_start為0
,l_len為0
。某個檔案描述符被關閉時,與它關聯的記錄鎖都被刪除。記錄鎖不能通過
fork
子程序繼承。
記錄鎖不應該同標準
i/o函式一起使用,因為標準
i/o庫使用了緩衝。
nfs可以使用記錄鎖。
UNIX網路程式設計卷二 筆記 Posix訊息佇列
每個訊息都是乙個有優先順序的記錄,程序寫入訊息前,不需要有其它程序在等待訊息。訊息佇列具有隨核心的持續性。posix 訊息佇列與 system v 訊息佇列的兩個主要區別 1.posix 讀返回最高優先順序的最早訊息,system v 返回指定優先順序的最早訊息。2.向空佇列放置乙個訊息時,posi...
《UNIX網路程式設計 卷2》 筆記 管道
管道是最初的unix ipc形式,它的侷限性在於沒有名字,只能在有親緣關係的程序間使用。後來,fifo出現了,fifo也稱為有名管道。管道和fifo都使用read和write函式訪問。include int pipe int fd 2 管道由pipe函式建立,返回兩個描述符 fd 0 用來讀,fd ...
《UNIX網路程式設計 卷1》 筆記 UNIX域協議
unix域協議並不是乙個實際的協議族,而是在單個主機上客戶程序和伺服器程序之間通訊的一種方法。unix域使用的套接字結構如下 struct sockaddr un int main int argc,char argv 執行結果如下 可以看到繫結的路徑名 tmp 123 現在是乙個套接字檔案。uni...