出现了以下担忧:两个线程可以同时写入闪存,因此我们使用信号量。但是下面的 version1 中的写入函数logmytext()与“内部”信号量是不可重入的吗?即两篇文章是否有可能混乱?
我们应该将 version2 与“外部”信号量一起使用(主要需要很多输入)。或者我们只是担心太多? (注意:这是伪代码-C,“外部”和“内部”不是字面意思)。
VERSION1:
Image
版本2:
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();
}
答案 0 :(得分:0)
这两个版本具有相同的功能,因为对logmytext
的调用受到保护。第二个更容易出错,有些开发人员在将来调用logmytest
时肯定会忘记获取信号量,所以我不推荐它。类似主题描述为here
答案 1 :(得分: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();
如果连续多次调用相同的函数,则可以减少锁定。