2017-02-01 50 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(); 

可以较少锁如果您连续调用同一个功能很多次。