UNIX網路程式設計卷二 筆記 讀寫鎖和記錄上鎖

2021-06-17 19:23:03 字數 1690 閱讀 7352

讀寫鎖用於讀取資料比修改資料更頻繁的場景,它的分配規則如下:

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...