关于linux中的信号量

时间:2013-06-26 09:49:30

标签: c linux semaphore

我有以下代码:

int resource;
sem_t s;

void function2()
{
   // do some operation to resource
}


void function1()
{
   sem_wait(&s);

   function2();

   sem_post(&s);
}

如果我们有不同的流程同时调用function1,并且function1已经受信号量保护,我们是否需要使用信号量来保护function2

3 个答案:

答案 0 :(得分:1)

您真正需要做的是使用信号量保护您的共享数据。至少这是最好的做法。信号量基本上用于保护数据,可以从各种功能访问。典型用法可能如下所示:

struct data {
       yoursharedata;
       sem_t lock;
}

每当您访问yoursharedata(来自任何函数)时,抓住锁,操纵数据并释放锁。如下所示:

   sem_wait(lock);
   pock(yoursharedata);
   sem_post(lock);

希望这会有所帮助!

答案 1 :(得分:0)

从你的代码我可以说你在function1中保护了函数调用(function2()),而不是function1。任何调用引用function1将等到它从function2返回并且我认为不需要再次保护函数2,除非你在函数2中有共享资源。如果你在函数2中有共享资源,你需要保护那些资源。

答案 2 :(得分:0)

正如@VoidPointer在评论中所说,如果函数2在函数1内部没有被调用,则不需要。

这很容易理解为什么:你可以认为函数2被内联到调用的位置,对吗?在sem_wait和sem_post之间总是只有一个进程 - 所以你的数据是安全的。

但正如@rakib所说,只有在需要时才能更好地锁定数据,以避免不必要的等待。

您确定要使用信号量而不是互斥量吗?例如,请参阅:Difference between binary semaphore and mutex