可能的非重入函数下面的忧虑又拿出了:两个线程可以同时写入到闪存,所以我们使用信号量。但会写入功能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);
}
如果grab-和releasesemaphore使用相同的信号,第1版应该罚款。 – alain
只要你谈论在每种情况下的*同*信号,这两个版本应该是相同的。 –