国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linux下關于互斥鎖及同步的移植

運維 系統(tǒng)運維
將win32程序關于多線程的內容移植到Linux下面,不能簡單的按照函數(shù)對應來移植。不過通過下面的對應關系,再加上你對這些模式的深入了解,相信會移植的很成功。

將win32程序關于多線程的內容移植到Linux下面,不能簡單的按照函數(shù)對應來移植。不過通過下面的對應關系,再加上你對這些模式的深入了解,相信會移植的很成功。

信號量

Windows 信號量是一些計數(shù)器變量,允許有限個線程/進程訪問共享資源。Linux POSIX 信號量也是一些計數(shù)器變量,可以用來在 Linux 上實現(xiàn) Windows 上的信號量功能。

信號量的類型: Windows 提供了有名(named)信號量和無名(unnamed)信號量。有名信號量可以在進程之間進行同步。在 Linux 上,在相同進程的不同線程之間,則只使用 POSIX 信號量。在進程之間,可以使用 System V 信號量。

等待函數(shù)中的超時: 當在一個等待函數(shù)中使用時,可以為 Windows 信號量對象指定超時值。在 Linux 中,并沒有提供這種功能,只能通過應用程序邏輯處理超時的問題。

創(chuàng)建信號量

在 Windows 中,可以使用 CreateSemaphore() 創(chuàng)建或打開一個有名或無名的信號量。

HANDLE CreateSemaphore(

LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,

LONG lInitialCount,

LONG lMaximumCount,

LPCTSTR lpName

);

在這段代碼中:

lpSemaphoreAttributes 是一個指向安全性屬性的指針。如果這個指針為空,那么這個信號量就不能被繼承。

lInitialCount 是該信號量的初始值。

lMaximumCount 是該信號量的最大值,該值必須大于 0。

lpName 是信號量的名稱。如果該值為 NULL,那么這個信號量就只能在相同進程的不同線程之間共享。否則,就可以在不同的進程之間進行共享。

這個函數(shù)創(chuàng)建信號量,并返回這個信號量的句柄。它還將初始值設置為調用中指定的值。這樣就可以允許有限個線程來訪問某個共享資源。

在 Linux 中,可以使用 sem_init() 來創(chuàng)建一個無名的 POSIX 信號量,這個調用可以在相同進程的線程之間使用。

它還會對信號量計數(shù)器進行初始化:int sem_init(sem_t *sem, int pshared, unsigned int value)。在這段代碼中:

value(信號量計數(shù)器)是這個信號量的初始值。

pshared 可以忽略,因為在目前的實現(xiàn)中,POSIX 信號量還不能在進程之間進行共享。

這里要注意的是,最大值基于 demaphore.h 頭文件中定義的 SEM_VALUE_MAX。

在 Linux 中,semget() 用于創(chuàng)建 System V 信號量,它可以在不同集成的線程之間使用??梢杂盟鼇韺崿F(xiàn)與 Windows 中有名信號量相同的功能。這個函數(shù)返回一個信號量集標識符,它與一個參數(shù)的鍵值關聯(lián)在一起。當創(chuàng)建一個新信號量集時,對于與 semid_ds 數(shù)據(jù)結構關聯(lián)在一起的信號量,semget() 要負責將它們進行初始化,方法如下:

sem_perm.cuid 和 sem_perm.uid 被設置為調用進程的有效用戶 ID。

sem_perm.cgid 和 sem_perm.gid 被設置為調用進程的有效組 ID。

sem_perm.mode 的低 9 位被設置為 semflg 的低 9 位。

sem_nsems 被設置為 nsems 的值。

sem_otime 被設置為 0。

sem_ctime 被設置為當前時間。

用來創(chuàng)建 System V 信號量使用的代碼是:int semget(key_t key, int nsems, int semflg)。下面是對這段代碼的一些解釋:

key 是一個惟一的標識符,不同的進程使用它來標識這個信號量集。我們可以使用 ftok() 生成一個惟一的鍵值。

IPC_PRIVATE 是一個特殊的 key_t 值;當使用 IPC_PRIVATE 作為 key 時,這個系統(tǒng)調用就會只使用 semflg 的低 9 位,但卻忽略其他內容,從而新創(chuàng)建一個信號量集(在成功時)。

nsems 是這個信號量集中信號量的數(shù)量。

semflg 是這個新信號量集的權限。要新創(chuàng)建一個信號量集,您可以將使用 IPC_CREAT 來設置位操作或訪問權限。如果具有該 key 值的信號量集已經(jīng)存在,那么 IPC_CREAT/IPC_EXCL 標記就會失敗。

注意,在 System V 信號量中,key 被用來惟一標識信號量;在 Windows 中,信號量是使用一個名稱來標識的。

為了對信號量集數(shù)據(jù)結構進行初始化,可以使用 IPC_SET 命令來調用 semctl() 系統(tǒng)調用。將 arg.buf 所指向的 semid_ds 數(shù)據(jù)結構的某些成員的值寫入信號量集數(shù)據(jù)結構中,同時更新這個結構的 sem_ctime member 的值。用戶提供的這個 arg.buf 所指向的 semid_ds 結構如下所示:

sem_perm.uid

sem_perm.gid

sem_perm.mode (只有最低 9 位有效)

#p#

調用進程的有效用戶 ID 應該是超級用戶,或者至少應該與這個信號量集的創(chuàng)建者或所有者匹配: int semctl(int semid, int semnum, int cmd = IPC_SET, ...)。在這段代碼中:

semid 是信號量集的標識符。

semnum 是信號量子集偏移量(從 0 到 nsems -1,其中 n 是這個信號量集中子集的個數(shù))。這個命令會被忽略。

cmd 是命令;它使用 IPC_SET 來設置信號量的值。

args 是這個信號量集數(shù)據(jù)結構中要通過 IPC_SET 來更新的值(在這個例子中會有解釋)。

最大計數(shù)器的值是根據(jù)在頭文件中定義的 SEMVMX 來決定的。

打開信號量

在 Windows 中,我們使用 OpenSemaphore() 來打開某個指定信號量。只有在兩個進程之間共享信號量時,才需要使用信號量。在成功打開信號量之后,這個函數(shù)就會返回這個信號量的句柄,這樣就可以在后續(xù)的調用中使用它了。

HANDLE OpenSemaphore(

DWORD dwDesiredAccess,

BOOL bInheritHandle,

LPCTSTR lpName

)

在這段代碼中:

dwDesiredAccess 是針對該信號量對象所請求的訪問權。

bInheritHandle 是用來控制這個信號量句柄是否可繼承的標記。如果該值為 TRUE,那么這個句柄可以被繼承。

lpName 是這個信號量的名稱。

在 Linux 中,可以調用相同的 semget() 來打開某個信號量,不過此時 semflg 的值為 0:int semget(key,nsems,0)。在這段代碼中:

key 應該指向想要打開的信號量集的 key 值。

為了打開一個已經(jīng)存在的信號量,可以將 nsems 和標記設置為 0。semflg 值是在返回信號量集標識符之前對訪問權限進行驗證時設置的。

獲取信號量

在 Windows 中,等待函數(shù)提供了獲取同步對象的機制??梢允褂玫牡却瘮?shù)有多種類型;在這一節(jié)中,我們只考慮 WaitForSingleObject()(其他類型將會分別進行討論)。這個函數(shù)使用一個信號量對象的句柄作為參數(shù),并會一直等待下去,直到其狀態(tài)變?yōu)橛行盘枲顟B(tài)或超時為止。

DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds );

在這段代碼中:

hHandle 是指向互斥句柄的指針。

dwMilliseconds 是超時時間,以毫秒為單位。如果該值是 INFINITE,那么它阻塞調用線程/進程的時間就是不確定的。

在 Linux 中,sem_wait() 用來獲取對信號量的訪問。這個函數(shù)會掛起調用線程,直到這個信號量有一個非空計數(shù)為止。然后,它可以原子地減少這個信號量計數(shù)器的值:int sem_wait(sem_t * sem)。

在 POSIX 信號量中并沒有超時操作。這可以通過在一個循環(huán)中執(zhí)行一個非阻塞的 sem_trywait() 實現(xiàn),該函數(shù)會對超時值進行計算:int sem_trywait(sem_t * sem)。

在使用 System V 信號量時,如果通過使用 IPC_SET 命令的 semctl() 調用設置初始的值,那么必須要使用 semop() 來獲取信號量。semop() 執(zhí)行操作集中指定的操作,并阻塞調用線程/進程,直到信號量值為 0 或更大為止:int semop(int semid, struct sembuf *sops, unsigned nsops)。

函數(shù) semop() 原子地執(zhí)行在 sops 中所包含的操作 也就是說,只有在這些操作可以同時成功執(zhí)行時,這些操作才會被同時執(zhí)行。sops 所指向的數(shù)組中的每個 nsops 元素都使用 struct sembuf 指定了一個要對信號量執(zhí)行的操作,這個結構包括以下成員:

unsigned short sem_num; (信號量個數(shù))

short sem_op; (信號量操作)

short sem_flg; (操作標記)

要獲取信號量,可以通過將 sem_op 設置為 -1 來調用 semop();在使用完信號量之后,可以通過將 sem_op 設置為 1 來調用 semop() 釋放信號量。通過將 sem_op 設置為 -1 來調用 semop(),信號量計數(shù)器將會減小 1,如果該值小于 0(信號量的值是不能小于 0 的),那么這個信號量就不能再減小,而是會讓調用線程/進程阻塞,直到其狀態(tài)變?yōu)橛行盘枲顟B(tài)為止。

sem_flg 中可以識別的標記是 IPC_NOWAIT 和 SEM_UNDO。如果某一個操作被設置了 SEM_UNDO 標記,那么在進程結束時,該操作將被取消。如果 sem_op 被設置為 0,那么 semop() 就會等待 semval 變成 0。這是一個等待為 0 的操作,可以用它來獲取信號量。

記住,超時操作在 System V 信號量中并不適用。這可以在一個循環(huán)中使用非阻塞的 semop()(通過將 sem_flg 設置為 IPC_NOWAIT)實現(xiàn),這會計算超時的值。

#p#

釋放信號量

在 Windows 中,ReleaseSemaphore() 用來釋放信號量。

BOOL ReleaseSemaphore(

HANDLE hSemaphore,

LONG lReleaseCount,

LPLONG lpPreviousCount

);

在這段代碼中:

hSemaphore 是一個指向信號量句柄的指針。

lReleaseCount 是信號量計數(shù)器,可以通過指定的數(shù)量來增加計數(shù)。

lpPreviousCount 是指向上一個信號量計數(shù)器返回時的變量的指針。如果并沒有請求上一個信號量計數(shù)器的值,那么這個參數(shù)可以是 NULL。

這個函數(shù)會將信號量計數(shù)器的值增加在 lReleaseCount 中指定的值上,然后將這個信號量的狀態(tài)設置為有信號狀態(tài)。

在 Linux 中,我們使用 sem_post() 來釋放信號量。這會喚醒對這個信號量進行阻塞的所有線程。信號量的計數(shù)器同時被增加 1。要為這個信號量的計數(shù)器添加指定的值(就像是 Windows 上一樣),可以使用一個互斥變量多次調用以下函數(shù):int sem_post(sem_t * sem)。

對于 System V 信號量來說,只能使用 semop() 來釋放信號量:int semop(int semid, struct sembuf *sops, unsigned nsops)。

函數(shù) semop() 原子地執(zhí)行 sops 中包含的一組操作(只在所有操作都可以同時成功執(zhí)行時,才會將所有的操作同時一次執(zhí)行完)。sops 所指向的數(shù)組中的每個 nsops 元素都使用一個 struct sembuf 結構指定了一個要對這個信號量執(zhí)行的操作,該結構包含以下元素:

unsigned short sem_num;(信號量個數(shù))

short sem_op; (信號量操作)

short sem_flg; (操作標記)

要釋放信號量,可以通過將 sem_op 設置為 1 來調用 semop()。通過將 semop() 設置為 1 來調用 semop(),這個信號量的計數(shù)器會增加 1,同時用信號通知這個信號量。

關閉/銷毀信號量

在 Windows 中,我們使用 CloseHandle() 來關閉或銷毀信號量對象。

BOOL CloseHandle(

HANDLE hObject

);

hObject 是指向這個同步對象句柄的指針。

在 Linux 中,sem_destroy() 負責銷毀信號量對象,并釋放它所持有的資源: int sem_destroy(sem_t *sem)。對于 System V 信號量來說,只能使用 semctl() 函數(shù)的 IPC_RMID 命令來關閉信號量集:int semctl(int semid, int semnum, int cmd = IPC_RMID, ...)。

這個命令將立即刪除信號量集及其數(shù)據(jù)結構,并喚醒所有正在等待的進程(如果發(fā)生錯誤,則返回,并將 errno 設置為 EIDRM)。調用進程的有效用戶 ID 必須是超級用戶,或者可以與該信號量集的創(chuàng)建者或所有者匹配的用戶。參數(shù) semnum 會被忽略

【編輯推薦】

  1. Linux系統(tǒng)下配置Netware服務器方法
  2. 嵌入式設備上的 Linux 系統(tǒng)開發(fā)
  3. 深度介紹Linux內核是如何工作的(1)
責任編輯:趙寧寧 來源: csdn
相關推薦

2020-08-26 08:59:58

Linux線程互斥鎖

2024-06-28 08:45:58

2024-03-07 07:47:04

代碼塊Monitor

2011-01-14 13:50:37

2025-02-17 02:00:00

Monitor機制代碼

2024-07-25 11:53:53

2012-03-07 10:34:44

Java

2023-06-02 08:29:24

https://wwMutex

2024-06-24 08:10:00

C++互斥鎖

2020-09-04 10:14:02

Linux驅動7內核

2012-03-09 10:44:11

Java

2020-09-16 07:56:28

多線程讀寫鎖悲觀鎖

2024-08-08 08:19:03

2023-12-24 12:33:20

互斥鎖Go代碼

2010-03-04 10:04:10

Linux動態(tài)庫

2021-06-06 12:59:14

實現(xiàn)方式計數(shù)

2020-09-22 07:35:06

Linux線程進程

2020-09-28 06:49:50

Linux系統(tǒng)編程互斥量mutex

2010-06-22 15:31:22

autoconf安裝

2017-07-04 17:43:07

架構CQRSEvent Sourc
點贊
收藏

51CTO技術棧公眾號

97视频在线观看免费| 日日噜噜噜夜夜爽爽| caopo在线| 成人亚洲一区二区一| 91chinesevideo永久地址| 天堂av资源在线观看| 亚洲欧美自拍偷拍| 亚洲精品白虎| 婷婷久久综合| 久久99亚洲精品| 欧洲在线视频| 色综合久久中文字幕| 在线免费视频a| 久久99热狠狠色一区二区| 国产一区二区女| 成人深夜福利app| 精品欧美日韩在线| 在线日韩一区| 美女视频黄免费的亚洲男人天堂| 18视频在线观看| 精品久久久免费| 高清成人av| 99久久精品国产观看| 中文字幕一区二区三区在线乱码 | 四虎4hu新地址入口2023| 秋霞午夜av一区二区三区| 国产免费一区二区三区在线能观看| 农村妇女一区二区| 日韩精品中文字幕在线| 性欧美1819sex性高清大胸| 色一情一伦一子一伦一区| 国产视频一二三| 中文字幕欧美日本乱码一线二线| 欧美久久在线观看| 久久狠狠亚洲综合| 欧美一区二区三区在线播放| 一区二区毛片| 麻豆av一区二区| 一本久道久久综合狠狠爱| 97碰碰视频| 欧美三级不卡| 国产欧美一区二区三区久久人妖| 日韩深夜影院| 欧美在线不卡区| www.国产精品一区| 久久久久久久97| 欧亚精品一区| 国产成人中文字幕| 国产综合久久久| 国产精品久久久久av免费| 欧美色蜜桃97| 亚洲已满18点击进入在线看片| 99久久婷婷| 国产麻豆日韩| 久久国产高清| 正在播放久久| 成人一区二区三区视频| 国产熟人av一二三区| 亚洲欧美综合色| 日韩大胆人体| 欧美日韩电影一区| 国产无遮挡裸体视频在线观看| 日韩av在线直播| 国产成人毛片| 91av在线看| 久久激情电影| 日韩欧美电影一区二区| 国产v综合v亚洲欧| 性欧美1819| 色婷婷久久久久swag精品| 丝袜美腿av在线| 久久精品视频va| 欧美美女在线| 美女精品国产| 北条麻妃一区二区三区| 又黄又爽又色视频| 在线精品观看国产| 国产伦子伦对白在线播放观看| 久久精品国产精品亚洲| 亚洲素人在线| 欧美日韩在线高清| 91丨porny丨中文| 一级在线免费观看| 亚洲电影中文字幕| 波多野结衣欧美| 国产精品日韩高清| 国产成人亚洲综合a∨猫咪| 成人图片小说| 91精品国产免费| 亚洲精品一区国产| 国产一区精品视频| 久久日韩精品一区二区五区| 中文视频在线| 国产亚洲人成网站在线观看| 日韩精品1区| 亚洲欧美日韩不卡| 一区二区三区在线观看国产| 欧美xxxx免费虐| 欧美一性一乱一交一视频| 日韩va亚洲va欧美va久久| 羞羞免费视频| 精品国产凹凸成av人网站| 国产精品久久久网站| 欧美一区二区三区精美影视| 亚洲欧洲在线观看av| aa级大片免费在线观看| 国产精品黄色影片导航在线观看| 久久99国产精品尤物| 在线观看污网站| 久久精品91久久香蕉加勒比| 欧美ab在线视频| 一本大道熟女人妻中文字幕在线| 欧美性欧美巨大黑白大战| 国内精品视频| 欧美综合激情| 午夜精品爽啪视频| 久久99国产精品二区高清软件| 国产99视频精品免费视频36| 欧美激情在线一区二区| 黄页在线观看免费| 91在线中文字幕| 国产亚洲精品7777| 国产在线88av| 久久国产精品精品国产色婷婷 | 欧洲不卡视频| 国语自产精品视频在线看一大j8| 日产欧产美韩系列久久99| 网址你懂得在线观看| www国产91| 奇米在线7777在线精品| 免费播放片a高清在线观看| 69久久夜色精品国产69| 丁香婷婷综合五月| 超碰在线最新网址| 精品国产一区二区三区四区vr| 一区二区三区加勒比av| 亚洲一区二区三区四区电影| 天堂av在线中文| 欧美 日韩 国产 高清| 51精品久久久久久久蜜臀| 国产欧美日韩影院| 日本成人在线免费视频| 国产一区二区三区丝袜| 免费高清视频精品| 久草免费在线观看| 91久久爱成人| 狠狠色香婷婷久久亚洲精品| 欧美激情极品| 黄色永久免费网站| 色综合91久久精品中文字幕| 暴力调教一区二区三区| 亚洲人体视频| 亚洲一一在线| 亚洲国产精品久久久久秋霞蜜臀 | 国产精品美女视频| 国产精品99久久免费| 香港三级日本三级a视频| 亚洲国产欧美一区二区三区同亚洲 | 欧美激情视频三区| 99r精品视频| 96视频在线观看欧美| 成人免费视频91| 色午夜这里只有精品| 丁香网亚洲国际| 国产一区精品福利| 成人在线看视频| 欧美精品福利在线| 中文字幕一区二区视频| 欧美国产不卡| 中国国产一级毛片| 亚洲xxxx18| 欧美日韩一级二级三级| 亚洲综合电影一区二区三区| 超碰公开在线| 午夜探花在线观看| 自拍视频国产精品| 久久男人中文字幕资源站| 波多野结衣在线一区二区 | 一区二区三区日本| 久久裸体网站| 国产香蕉在线| 日本黑人久久| 国产亚洲在线播放| 韩国中文免费在线视频| 日韩精品视频免费在线观看| 国产98色在线|日韩| 自拍偷拍亚洲| 91精品国产高久久久久久五月天| 国产精品免费一区| 欧美老人xxxx18| 国产一区二区三区在线观看免费视频 | 一区二区三区在线播| 欧美激情一区| av午夜在线观看| 大伊香蕉精品视频在线| 性欧美办公室18xxxxhd| 欧美性生交xxxxx久久久| 久久99国产精品久久99果冻传媒| 国产精品一区二区三区av| 在线观看国产高清视频|