linux操作系統之信號量、互斥量在進程間的同步、文件鎖

(1)信號量:進化版的互斥量

? ? ? ? ?多個線程間對某個對象的部分數據進行共享,使用互斥鎖是沒有辦法實現的,只能將整個數據對象鎖住。這樣雖然達到了多線程操作數據共享的目的,卻導致線程并發性下降。

? ? ? ? ?信號量:相對折中的一個處理方式,既能保證同步,數據不混亂,又能提高線程開發。

(2)信號量相關函數

? ? ? ? ? sem_t類型,用來定義信號量。雖然是結構體,使用的時候可以當做整數看待(類似文件描述符)。

? ? ? ? ? ?規定信號量不能小于0,信號量的初值,決定了占用信號量的線程的個數。

? ? ? ? ? 頭文件在<semaphore.h>

? ? ? ? ? ?1)初始化一個信號量:sem_init

? ? ? ? ? ? ? ? ? ? ?int? sem_init(sem_t *sem,int pshared,unsigned int value);

? ? ? ? ? ? ? ? ? ? ? ? ? 參數1:信號量

? ? ? ? ? ? ? ? ? ? ? ? ?參數2:取0表示線程間共享,取1表示進程間

? ? ? ? ? ? ? ? ? ? ? ? ?參數3;信號量初值

? ? ? ? ? ?2)銷毀一個信號量:sem_destroy

? ? ? ? ? ? ? ? ? ?int sem_destroy(sem_t *sem);

? ? ? ? ??3)給信號量加鎖:sem_wait(信號量初值--)

? ? ? ? ? ? ? ? ? ?int sem_wait(sem_t *sem);

? ? ? ? ? 4)給信號量解鎖:sem_post(信號量初值++)

? ? ? ? ? ? ? ? ? ?int sem_post(sem_t *sem);

? ? ? ? ? 5)嘗試對信號量加鎖:sem_trywait

? ? ? ? ? ? ? ? ???int sem_trywait(sem_t *sem);

? ? ? ? ? 6)限時嘗試給信號量加鎖:sem_timedwait

? ? ? ? ? ? ? ? ???int sem_timedwait(sem_t *sem,const struct timespec*abs_timeout);

(3)進程間同步

? ? ? ? ? ? ?進程間也可以通過互斥鎖來達到同步,但必須在pthread_mutex_init初始胡之前,修改其屬性為進程間共享。

? ? ? ? ? ? ? pthread_mutexattr_t mattr類型,用來定義mutex鎖的屬性,修改mutex鎖屬性函數。

? ? ? ? ? ? ? ? ? ?1)初始化一個mutex屬性對象:pthread_mutexattr_init

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int pthread_mutexattr_init(pthread_mutexattr_t *attr);

? ? ? ? ? ? ? ? ? ?2)銷毀一個mutex屬性對象:pthread_mutexattr_destroy

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);?

? ? ? ? ? ? ? ? ? ?3)修改mutex屬性

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr , int pshared);?

? ? ? ? ? ? ? ? ? ? ? ? ? ? 參數2:取值:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?線程鎖:PTHREAD_PROCESS_PRIVATE(mutex默認屬性,進程間私有);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?進程鎖:PTHREAD_PROCESS_SHARED

(4)使用進程鎖完成同步

? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

(5)文件鎖

? ? ? ? ? ? ? ? 借助fcntl來實現鎖機制。操作文件的進程沒有獲得鎖時 ,可以打開,但無法執行read/write操作

? ? ? ? ? ? ? ? ? ? ? ? ?fcntl函數:獲取和修改文件訪問控制屬性

? ? ? ? ? ? ? ? ?int fcntl(int fd,int cmd,.../*arg*/);

? ? ? ? ? ? ? ? ? ? ? ? ? 參數2:F_SETLK:設置文件鎖(trylock)? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? F_SETLKW 設置文件鎖(wait)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? F_GETLK 獲取文件鎖

? ? ? ? ? ? ? ? ? ? ? ? ?參數3:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? struct flock{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.....?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? short l_type;//鎖的類型:F_RDLCK,F_WRLCK,F_UNLCK(解鎖);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? short l_whence;//偏移位置,SEEK_SET,SEEK_CUR,SEEK_END

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? off_t l_start;//起始偏移量

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? off_t l_len;? //加鎖數據的長度,len=0,對整個文件加鎖

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pid_t l_pid;//持有該鎖的進程ID:(F_GETLK only)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?};

(6)進程間文件鎖

? ? ?

(7)多線程中,能否使用文件鎖?

? ? ? ? ? ? ? ? ? ?多線程之間共享文件描述符,而給文件加鎖,是通過修改文件描述符所指向的文件結構體中的成員變量來實現的。因此線程之間無法使用文件鎖。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382311.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux網絡編程之網絡應用設計模式、分層模型、通信過程

&#xff08;1&#xff09;網絡協議 可以理解為規則&#xff0c;其中包含著數據傳輸和數據的解釋。 典型的協議&#xff1a;傳輸層&#xff1a;tcp/udp協議&#xff0c;應用層&#xff1a;http/ftp協議&#xff0c;網絡層&#xff1a;ip協議&#xff0c;網路接口&#xff1a;ar…

680. 驗證回文字符串 Ⅱ golang

題目 驗證回文字符串 Ⅱ 給定一個非空字符串 s&#xff0c;最多刪除一個字符。判斷是否能成為回文字符串。 示例 1: 輸入: “aba” 輸出: True 示例 2: 輸入: “abca” 輸出: True 解釋: 你可以刪除c字符。 注意: 字符串只包含從 a-z 的小寫字母。字符串的最大長度是50000…

linux網絡編程之通信協議格式

好文參考&#xff1a;《網路傳輸的三張表&#xff1a;MAC地址表&#xff0c;ARP緩存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html &#xff08;1&#xff09;數據包封裝 傳輸層及其一下的機制由內核決定&#xff0c;主要負責通訊的具體細節&#xff1b;應用層由用…

88. 合并兩個有序數組 golang

88. 合并兩個有序數組 給你兩個有序整數數組 nums1 和 nums2&#xff0c;請你將 nums2 合并到 nums1 中&#xff0c;使 nums1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。 你可以假設 nums1 有足夠的空間&#xff08;空間大小大于或等于 m …

linux網絡編程之Socket編程

&#xff08;1&#xff09;socket套接字 1&#xff09;在linux環境下&#xff0c;socket用于表示進程間網絡通信的特殊文件類型&#xff0c;其本質是內核借助緩沖區形成的偽文件&#xff08;不占磁盤空間&#xff0c;除此之外還有二進制文件&#xff0c;管道&#xff0c;字符文…

Linux操作系統之簡易實現server/client

1.首先將出錯處理封裝成函數&#xff0c;具體封裝思想&#xff1a;是在底層函數的基礎上將首字母大寫&#xff08;方便在編程中查找函數文件的manpage,而不需要使用命令&#xff0c;直接用shiftk&#xff09;,然后調用底層庫函數并考慮出錯處理&#xff0c;具體函數如下&#x…

75. 顏色分類 golang

https://leetcode-cn.com/problems/sort-colors/solution/75-yan-se-fen-lei-golang-by-hodgekou/ Me func sortColors(nums []int) {sort.Ints(nums) }tips package mainimport ("fmt""sort" )//定義interface{},并實現sort.Interface接口的三個方法 ty…

linux網絡編程之TCP三次握手和四次揮手

1.在TCP連接的過程中&#xff0c;有三個階段&#xff0c;分別是建立連接&#xff0c;傳遞數據和斷開連接&#xff0c;通訊時序圖如下所示: 2.結合TCP數據報格式分析建立連接的三次握手 1&#xff09;首先客戶端發送一個帶有SYN標志的TCP報文給服務器端&#xff0c;詢問服務器端…

451. 根據字符出現頻率排序golang

官解 func frequencySort(s string) string {charMap : make(map[rune]int)arr : make([]string, len(s))for _,c : range s {charMap[c]}for k,v : range charMap {arr[v - 1] strings.Repeat(string(k), v)}r : ""for _,c : range arr {r c r}return r }自定義排…

linux網路編程之多進程并發服務器

1&#xff09;使用多進程并發服務器考慮的因素&#xff1a; &#xff08;1&#xff09;父進程描述最大文件描述符的個數&#xff08;父進程需要關閉accept返回的新文件描述符&#xff09; &#xff08;2&#xff09;系統內可創建進程的個數&#xff08;與內存大小相關&#xff…

69. x 的平方根 golang

Me https://leetcode-cn.com/problems/sqrtx/submissions/ func mySqrt(x int) int {return int(math.Sqrt(float64(x))) }

linux網路編程之多線程并發服務器

1&#xff09;在使用進程模型開發服務器過程中考慮以下問題 &#xff08;1&#xff09;調整進程內最大文件描述符上限 &#xff08;2&#xff09;線程如有共享&#xff0c;考慮線程同步 &#xff08;3&#xff09;客戶端線程退出時&#xff0c;做退出處理&#xff08;線程分離&…

744. 尋找比目標字母大的最小字母 golang

官解 func nextGreatestLetter(letters []byte, target byte) byte {idx : 0for i : 0; i < len(letters); i {if letters[i] > target {idx ibreak}}return letters[idx] }Me 這個題答得很差勁&#xff0c;可能有點累 func nextGreatestLetter(letters []byte, target…

linux網路編程之TCP狀態轉換及端口復用

&#xff08;1&#xff09;TCP狀態轉換圖 其中圖中分為三種狀態&#xff1a;實線代表的主動發起連接&#xff0c;虛線代表的被動發起連接&#xff0c;細實線代表的可以雙向發起連接的狀態。 主動發起連接方狀態變化&#xff1a;1&#xff09;主動發起連接的一方發送SYN標志位&…

153. 尋找旋轉排序數組中的最小值 golang

153. 尋找旋轉排序數組中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j : 0, 1for j < len(nums) {if nums[i] < nums[j] {ij} else {return nums[j]}}return nums[0] }

linux網絡編程之多路I/o轉接服務器select

(1)多路IO轉接服務器也叫做多任務IO服務器&#xff0c;其主要思想是不再由程序自己監聽客戶端連接&#xff0c;取而代之的是由內核替應用程序監視文件&#xff0c;具體實現模型如圖所示&#xff1a; 當客戶端請求和服務器連接時&#xff0c;內核接收到連接指令&#xff0c;告訴…

linux網絡編程之多路I/O轉接服務器poll函數

&#xff08;1&#xff09;poll函數 頭文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//監控的事件 short revents;//監控事件中滿足條件返回的事情 }&#xff1…

540. 有序數組中的單一元素 golang

540. 有序數組中的單一元素 golang func singleNonDuplicate(nums []int) int {if len(nums) < 1 {return nums[0]}i : 0for i < len(nums) - 1 {if nums[i] ! nums[i1] {return nums[i]} else {i2}}return nums[i] }

C/C++構造及析構順序及變量的生命周期

&#xff08;1&#xff09;變量的構造及析構順序 1&#xff09;在全局范圍內定義的對象&#xff08;即在所有函數之外定義的對象&#xff09;&#xff0c;它的構造函數在文件中的所有函數&#xff08;包括main函數&#xff09;執行之前調用。如果一個程序中有多個文件&#xff…

34. 在排序數組中查找元素的第一個和最后一個位置 golang

34. 在排序數組中查找元素的第一個和最后一個位置 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/submissions/ Me func searchRange(nums []int, target int) []int {result : make([]int, 2)result[0] -1result[1] -1for …