我有以下代码:
int resource;
sem_t s;
void function2()
{
// do some operation to resource
}
void function1()
{
sem_wait(&s);
function2();
sem_post(&s);
}
如果我们function1
同时有不同的进程调用,并且function1
已经受到信号量的保护,我们是否需要有信号量来保护function2
?
What you really need to do, is to protect your share data using semaphore. Atleast this is the best practice. Semaphore is basically use to protect data, which is accessible from various functions. A typical use might look like this:
struct data {
yoursharedata;
sem_t lock;
}
Whenever you'll access to yoursharedata (from any function) grab the lock, manipulate the data and release the lock. Something like below:
sem_wait(lock);
pock(yoursharedata);
sem_post(lock);
Hope this will help!
从您的代码中,我可以说您在函数 1 中保护了函数调用(函数 2()),而不是函数 1。任何引用函数 1 的调用都会等到它从函数 2 返回,我认为没有必要再次保护函数 2,除非您在函数 2 中有共享资源。如果您在函数 2 中有共享资源,则需要保护该资源。
正如@VoidPointer 在评论中所说,如果函数2没有在其他任何地方调用,而是在函数1内部调用,则不需要。
这很容易理解为什么:你可以认为 function2 被内联到调用所在的位置,对吧?sem_wait 和 sem_post 之间总是只有一个进程——所以你的数据是安全的。
但正如@rakib 所说,最好只在需要时锁定数据以避免不必要的等待。
您确定要使用信号量而不是互斥锁吗?参见例如:二进制信号量和互斥量之间的区别