計數型訊號量

2021-10-09 11:20:25 字數 3594 閱讀 3508

目錄

計數型訊號量

1.create

2.delete

3.wait

4.post

5.clear

6.status

7.getname

計數型訊號量通常用於多個執行緒共享使用某資源。 下圖

乙個 sylixos

計數型訊號量可以呼叫

lw_semaphorec_create

函式進行建立。

#include lw_handle lw_semaphorec_create(cpchar pcname,

ulong ulinitcounter,

ulong ulmaxcounter,

ulong uloption,

lw_object_id *pulid);

函式

lw_semaphorec_create

原型分析:

計數型訊號量的取值範圍為

0 <=

計數值(

ulinitcounter

)< ulmaxcounter(sylixos

支援的最大計數型訊號量值為

4294967295

)。特殊地,如果ulinitcounter

的值為

0,則可以應用於多執行緒間的同步。

乙個不再使用的計數型訊號量,可以呼叫以下函式將其刪除。刪除後的訊號量系統自動,**其占用的系統資源(試圖使用被刪除的計數型訊號量將出現未知的錯誤)。

#include ulong lw_semaphorec_delete(lw_handle *pulid);
函式

lw_semaphorec_delete

原型分析:

執行緒如果需要等待乙個計數型訊號量,可以呼叫

lw_semaphorec_wait 函式

需要注意的是,中斷服務程式不能呼叫 lw_semaphorec_wait

函式等待乙個計數型訊號量,因為lw_semaphorec_wait 函式在計數型訊號量值為

0(執行緒同步功能)時會阻塞當前執行緒。

#include ulong lw_semaphorec_wait(lw_handle ulid, ulong ultimeout);

ulong lw_semaphorec_trywait(lw_handle ulid);

以上兩個函式原型分析:

lw_semaphorec_trywait

和 lw_semaphorec_wait

的區別在於,如果計數型訊號量當前的值為0

,lw_semaphorec_trywait

會立即退出,並返回

error_thread_wait_timeout

,而 lw_semaphorec_wait

則會阻塞直到被喚醒。

中斷服務程式

可以使用

lw_semaphorec_

trywait

函式嘗試等待計數型訊號量,lw_semaphorec_trywait 函式在計數型訊號量的值為

0 時會立即返回,不會阻塞當前執行緒。

釋放乙個計數型訊號量

可以呼叫

lw_semaphorec_

post

函式。

#include ulong lw_semaphorec_post(lw_handle ulid);
函式

lw_semaphorec_post

原型分析:

一次釋放多個計數型訊號量

可以呼叫

lw_semaphorec_

release

函式。

#include ulong lw_semaphorec_release(lw_handle ulid,

ulong ulreleasecounter,

ulong *pulpreviouscounter);

函式

lw_semaphorec_release

原型分析:

lw_semaphorec_release

是乙個高階

api,

posix

讀寫鎖呼叫該函式來同時釋放多個讀寫執行緒。

呼叫 lw_semaphorec_clear

函式將清除計數型訊號量,這將使計數型訊號量的初始值置為 0。

#include ulong lw_semaphorec_clear(lw_handle ulid);
函式

lw_semaphorec_clear

原型分析:

呼叫

lw_ semaphorec_flush

函式將釋放等待在指定計數型訊號量上的所有執行緒。

#include ulong lw_semaphorec_flush(lw_handle ulid, ulong *pulthreadunblocknum);
函式

lw_semaphorec_flush

原型分析:

以下兩個函式可以獲得指定計數型訊號量的狀態資訊。

#include ulong lw_semaphorec_status(lw_handle ulid,

ulong *pulcounter,

ulong *puloption,

ulong *pulthreadblocknum);

ulong lw_semaphorec_statu***(lw_handle ulid,

ulong *pulcounter,

ulong *puloption,

ulong *pulthreadblocknum,

ulong *pulmaxcounter);

以上兩個函式原型分析:

lw_semaphorec_getname

函式可以獲得指定計數型訊號量的名字。

#include ulong lw_semaphorec_getname(lw_handle ulid, pchar pcname);
函式

lw_semaphorec_getname

原型分析:

FreeRTOS計數型值訊號量

include freertos.h include task.h include queue.h include semphr.h include os start.h define start task prio 1 define start stk size 128 taskhandle t ...

AND型訊號量

避免出現多個資源共享導致的死鎖,那麼在每個程序把需要的各種資源都得到並完成計算之後釋放,另乙個程序也在拿到需要的全部資源之後計算,這樣就不會出現交叉使用資源的情況。每個程序把需要的全部資源拿到後才會進入臨界區。那麼wait操作就需要改變 wait s1,s2,sn else s1到sn都表示所需資源...

ucos 計數訊號量

1 計數訊號量 1.1 建立訊號量 當事件控制塊os event中的oseventtype os event type sem時,則表示此處建立的事件為訊號量。上面為計數訊號量的建立函式,建立函式不能在中斷中呼叫,在全域性的事件控制塊列表中取出乙個事件控制塊pevent,對pevent進行初始化操作...