我有以下代码:
int resource;
sem_t s;
void function2()
{
// do some operation to resource
}
void function1()
{
sem_wait(&s);
function2();
sem_post(&s);
}
如果我们有不同的流程同时调用function1
,并且function1
已经受信号量保护,我们是否需要使用信号量来保护function2
?
答案 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