嵌入式C中的信号量和可能的非重入函数

时间:2017-02-01 11:09:03

标签: c

出现了以下担忧:两个线程可以同时写入闪存,因此我们使用信号量。但是下面的 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();
}

2 个答案:

答案 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(); 

如果连续多次调用相同的函数,则可以减少锁定。