信號量函數sem.c
發布時間:2012/4/3 0:42:29 訪問次數:1521
MantisOS中下信號量函數sem.c,主要調用了Linux底層的AD736JN信號量函數接口semaphore.c來控制多線程環境中共享資源的計數器。
信號量是在多線程環境中共享資源的計數器。對信號量的基本操作無非有3個:對信號量的增加;然后阻塞線程等待,直到信號量不為空才返回;對信號量的減少。在編程中,信號量最常用的方式就是一個線程A使用sem_wait阻塞,因為此時信號量計數為O,直到另外一個線程B發出信號post后,信號量計數加1,此時,線程A得到了信號,信號量的計數為1不為空,所就從sem_wait返回,然后信號量的計數又減1變為零。在使用信號量之前,必須對信號量進行初始化。第三個參數通常設置零,初始化信號的計數為0,這樣第一次伎用sem_wait時會因為信號計數為O而等待,直到在其他地方信號量post才返回(除非用戶明白自己在干什么,否則不要將第三個參數設置為大于0的數)。第二個參數是用在進程之間的數據共享標志,如果僅僅使用在當前進程中,設置為0。如果要在多個進程之間使用該信號,設置為非零。但是在Linux線程中,暫時還不支持進程之間的信號共享,所以第二個參數必須設置為0。當信號的計數為零時,sem_wait將休眠掛起當前調用線程,直到信號量計數不為零。在sem_wait返回后信號量計數將自動減1。解除信號量等待限制。讓信號量計數加1,該函數會立即返回不等待。現在sem_post被POSIX所規范,當它改變信號量計數器值時是線程安全的。
當semjnit失敗時,常見錯誤有:第三個參數value值超過了系統能夠承受的最大值SEM_VALUE_MAX;將第二參數設置為非零,如果是Linux系統,則將第二個參數設置為零。
MantisOS中下信號量函數sem.c,主要調用了Linux底層的AD736JN信號量函數接口semaphore.c來控制多線程環境中共享資源的計數器。
信號量是在多線程環境中共享資源的計數器。對信號量的基本操作無非有3個:對信號量的增加;然后阻塞線程等待,直到信號量不為空才返回;對信號量的減少。在編程中,信號量最常用的方式就是一個線程A使用sem_wait阻塞,因為此時信號量計數為O,直到另外一個線程B發出信號post后,信號量計數加1,此時,線程A得到了信號,信號量的計數為1不為空,所就從sem_wait返回,然后信號量的計數又減1變為零。在使用信號量之前,必須對信號量進行初始化。第三個參數通常設置零,初始化信號的計數為0,這樣第一次伎用sem_wait時會因為信號計數為O而等待,直到在其他地方信號量post才返回(除非用戶明白自己在干什么,否則不要將第三個參數設置為大于0的數)。第二個參數是用在進程之間的數據共享標志,如果僅僅使用在當前進程中,設置為0。如果要在多個進程之間使用該信號,設置為非零。但是在Linux線程中,暫時還不支持進程之間的信號共享,所以第二個參數必須設置為0。當信號的計數為零時,sem_wait將休眠掛起當前調用線程,直到信號量計數不為零。在sem_wait返回后信號量計數將自動減1。解除信號量等待限制。讓信號量計數加1,該函數會立即返回不等待。現在sem_post被POSIX所規范,當它改變信號量計數器值時是線程安全的。
當semjnit失敗時,常見錯誤有:第三個參數value值超過了系統能夠承受的最大值SEM_VALUE_MAX;將第二參數設置為非零,如果是Linux系統,則將第二個參數設置為零。