可能的非重入函數下面的憂慮又拿出了:兩個線程可以同時寫入到閃存,所以我們使用信號量。但會寫入功能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
只要你談論在每種情況下的*同*信號,這兩個版本應該是相同的。 –