2014-04-07 40 views
0

失敗,我在我的工作中使用Vxworks5.5如果能在semTake Vxworks5.5

m_SemServState = semBCreate(SEM_Q_FIFO, SEM_FULL); 

//.... In another function I have following code. 

SemStatus = semTake(m_SemServState, 500); 
    if(OK == SemStatus) 
    { 
     // ... 
    } 
    else 
    { 
     //... 
    } 
    semGive(m_SemServState); 

我已經按照上面的代碼下面的問題在我的項目代碼semGive調用。

  1. 上述代碼是否正常工作,即使semTake失敗,我們正在調用semGive?

  2. 當我與作者交談時,我被告知我們可以調用semGive,即使我semTake失敗。它會有什麼副作用嗎?

  3. 像上面這樣的編程是好的做法嗎?

感謝您的意見。

回答

0

首先,由於您正在創建二進制信號量,因此本身沒有「計數」。信號量是滿的或空的,沒有所有權的概念(就像互斥體一樣)。

令我困惑的是,運行此函數的任務看起來象徵着自己。

有兩種可能的錯誤類型返回這裏:

  • 超時(最有可能)
  • 一個真正的錯誤

我希望你做檢查錯誤號,以確定哪些你遇到的這兩種情況。 如果錯誤是而不是超時,那麼你可能在你手上有一個嚴重的問題,幾乎可以肯定,信號量的操作完全被破壞,在這種情況下,做一個semGive可能也會失敗。

如果錯誤是超時(即500滴答),那麼你的代碼應該沒問題。

如果只有一個任務運行此函數(並且沒有其他任務正在等待此相同信號量),則循環遍歷該函數將始終成功。事實上,我實在看不出這會如何失敗。

所以我必須推斷有多個任務正在等待相同的信號量。

沒有更多的細節,很難確定代碼是否能夠做到你想要的,但它是合法的。 如果不是超時,它確實取決於「else」分支中發生了什麼。

0

上述代碼是否正常工作,即使semTake失敗,我們正在調用semGive?

取決於你的意思是「工作」。

當我與作者交談時,我被告知我們可以調用semGive,即使我semTake失敗。它會有什麼副作用嗎?

當然你可以。即使你沒有抓住sempaphore,你也會增加信號值。這幾乎從來不是你想要做的。

像上面這樣的編程是好的做法嗎?

不,代碼很混亂,而且這是一個錯誤,如果你沒有獲取它,你甚至會釋放信號量 。

你想要做的預期

SemStatus = semTake(m_SemServState, 500); 
if(OK == SemStatus) 
{ 
    // ... 
    semGive(m_SemServState); 
} 
else 
{ 
    //... 
} 
+0

@它的工作意味着系統互聯化會按預期工作嗎? – venkysmarty

0

可能無法正常工作。

如果SemTake失敗並且您正在調用SemGive(),則SemGive()可能會也可能不會返回成功。

注意:SemGive()也會失敗,併發出警告,超出計數。

在上面的代碼中考慮下面的情況。

  1. SemTake()失敗,SemGive()失敗。
  2. SemTake()失敗,SemGive()返回成功。

你的代碼在2個案例中給出了意想不到的結果。

所以只有在SemTake()返回成功的情況下才應調用SemGive()。

SemStatus = semTake(m_SemServState, 500); 
    if(OK == SemStatus) 
    { 
     // ... 
     semGive(m_SemServState); 
    } 
    else 
    { 
     //... 
    }