2017-02-01 47 views
1

可能的非重入函數下面的憂慮又拿出了:兩個線程可以同時寫入到閃存,所以我們使用信號量。但會寫入功能logmytext()在VERSION1下面的「內部」旗語是不可重入?即這兩個文本有可能混亂嗎?信號燈和嵌入式C

所以我們應該使用版本2與「外部」信號量(主要需要很多輸入)。或者我們只是擔心太多? (注意:這是僞代碼-C,和「外部」和「內部」不應被字面理解)。

VERSION1:

thread_a() { 
    logmytext("Just started A"); 
} 

thread_b() { 
    logmytext("Just started B"); 
} 

void logmytext(atextstring) { 
    grabsemaphore(); // has tread_b text overwritten thread_a text now? 
    writetoflash(atextstring,1,2,3); 
    releasesemaphore(); 
} 

版本2:

thread_a() { 
    grabsemaphore(); // stop before the potential danger. 
    logmytext("Just started A"); 
    releasesemaphore(); // but a lot of code to type. 
} 

thread_b() { 
    grabsemaphore(); 
    logmytext("Just started B"); 
    releasesemaphore(); 
} 
void logmytext(atextstring) { // no semaphore in here 
    writetoflash(atextstring,1,2,3); 
} 
+0

如果grab-和releasesemaphore使用相同的信號,第1版應該罰款。 – alain

+0

只要你談論在每種情況下的*同*信號,這兩個版本應該是相同的。 –

回答

0

這兩個版本具有相同的功能,因爲調用logmytext保護。第二個是更容易出錯,一些開發商肯定會忘記在未來的呼叫搶信號量logmytest,所以我不會推薦它。類似的主題描述here

0

原因喜歡版本1 如果調用logmytext比在每個線程多一次,你想每次鎖定和解鎖,然後它看起來更好地編寫代碼。

原因喜歡版本2

grabsemaphore(); 
logmytext("Just started A"); 
logmytext("More Text"); 
logmytext("More Text"); 
logmytext("More Text"); 
logmytext("More Text"); 
logmytext("More Text"); 
releasesemaphore(); 

可以較少鎖如果您連續調用同一個功能很多次。