1、sem_post的介紹
sem_post是給信號量的值加上一個「1」,它是一個「原子操作」---即同時對同一個信號量做加「1」操作的兩個線程是不會沖突的;而同 時對同一個文件進行讀、加和寫操作的兩個程序就有可能會引起沖突。
2、關於linux下的多線程使用sem信號量的運行問題
不是信號量的問題
printf函數,是先寫到輸出緩沖,遇到\n時,或者緩沖區滿時,或者有強制輸出(fflush)時,才會將緩沖區里的內容輸出到屏幕上(標准輸出設備:stdout)。你的代碼裡面並沒有以上3個觸發條件的任意一種,所以printf的內存沒有實際輸出到屏幕上。
你只要在每個printf函數後面加上fflush(stdout);就可以了。
3、急!LINUX下,GCC編譯,原程序包含<semaphore.h>頭文件,為什麼編譯時說sem_wait,sem_post等未定義的引用
編譯時加上參數:-lpthread
要看報錯的階段,是在編譯還是鏈接階段.
如果編譯時函數沒有找到,那是頭文件的問題,如果鏈接時未定義引用,那是c庫的問題.
如果你的頭文件都正常包含了,那可能你的c庫沒有使能semaphore的支持.
4、ucos一個信號量被不斷的post而沒有被pend信號量會不斷累計嗎
計數初值表示所具有的資源數,應該不能取0吧,比如你去銀行辦理業務,業務員數就是資源數,也就是計數初值。如果為1則表示只有1個業務員,不知道你理解沒?
5、ostasksempost可以多個任務給一個任務發嗎
1、首先需要知道,μC/OS-II中創建任務的函數有兩個: OSTaskCreate()和OSTaskCreateExt()
(1)OSTaskCreate() //創建普通任務
由於重點在下面的創建擴展任務函數,故本函數就不多說了!確實,要想實現檢測目標任務棧實際使用情況的功能,是不能使用這個函數來創建目標任務的,必須使用OSTaskCreateExt() 。
(2)OSTaskCreateExt() //創建擴展任務
函數介面原型為:
#if OS_TASK_CREATE_EXT_EN > 0
INT8U OSTaskCreateExt
(
void (*task)(void *pd), //建立擴展任務(任務代碼指針
void *pdata, //傳遞參數指針
OS_STK *ptos, //分配任務堆棧棧頂指針
INT8U prio, //分配任務優先順序
INT16U id, //(未來的)優先順序標識(與優先順序相同)
OS_STK *pbos, //分配任務堆棧棧底指針
INT32U stk_size, //指定堆棧的容量(檢驗用)
void *pext, //指向用戶附加的數據域的指針
INT16U opt //建立任務設定選項
)
#endif
2、其次需要知道μC/OS-II中有這么個函數:OSTaskStkChk()
不錯,檢測任務堆棧實際使用情況正是用的這個函數,下面來本函數的介面原型:
INT8U OSTaskStkChk
(
INT8U prio, //待測任務的優先順序
OS_STK_DATA *pdata //指向一個類型為OS_STK_DATA的結構體
)
3、再次需要知道一個結構體:
#if OS_TASK_CREATE_EXT_EN > 0
typedef struct
{
INT32U OSFree; //堆棧中未使用的位元組數
INT32U OSUsed; //堆棧中已使用的位元組數
} OS_STK_DATA;
#endif
參數: prio 為指定要獲取堆棧信息的任務優先順序,也可以指定參數OS_PRIO_SELF,獲取調用任務本身的
信息。
pdata 指向一個類型為OS_STK_DATA的數據結構,其中包含如下信息:
INT32U OSFree; // 堆棧中未使用的位元組數
INT32U OSUsed; // 堆棧中已使用的位元組數
6、sem_post的說明
<