看到我有一个库有两个api允许调用
api1()
和
api2()
现在内部api2也调用了api1。
所以在我想做的一种情况是
我该怎么做?
有没有办法让我知道api1()是从库本身而不是应用程序调用的?
修改:
api1()
{
sem_wait(); // this create deadlock
// do some task
sem_post();
}
现在api2()就像这样
api2()
{
sem_wait();
api1();
sem_post();
}
看到我的两个函数...当应用程序调用api1()时我需要在sem_wait和sem_post中工作但是当api2()调用api1()时我不想再次sem_wait因为它的make dead lock ... / p>
我需要一些机制,所以api1()检查是否从api2()调用它然后不要使用sem_wait和sem_post
答案 0 :(得分:4)
内省不容易实现。您可以调查调用堆栈,但这非常不便携,实际上不建议使用。
解决此问题的一种方法是传递参数来控制行为的变化。这样做的另一个好处是使函数的行为更加透明和明确。正如@blueshift指出的那样,这会给外部呼叫者带来负担。将该功能拆分为两个版本,一个用于内部使用,一个用于外部使用,可以减轻这种负担。
根据您的编辑,我认为设计有点偏差。同步责任应该是函数内部的,或者是外部的。让责任有时是内部的,有时是外部的,这是非常危险的。这将是问题的一种方式。另一种方法是使用递归锁。
答案 1 :(得分:3)
对于两个不同的作业,您需要两个不同的函数调用(函数名称或参数)(+特殊工作和特殊工作)。上下文敏感的函数不仅不受C支持,而且完全是邪恶的,因为它们会增加整个Chomsky的复杂性。
答案 2 :(得分:2)
经常这样做:
// internal function
static int api1_internal(void) {
do stuff assuming the lock is held;
}
// function for external callers, doing extra locking
int api1(void) {
int ret;
lock();
ret = api1_internal();
unlock();
return ret;
}
// some internal function using internal api1
void internalfunc(void) {
lock();
do some things();
api1_internal();
unlock();
}
注意api1_internal被声明为static以使用它停止该文件之外的任何内容。
如果你真的想让自己迷惑,你可以先把api1()的定义,然后有类似的东西
#define api1 api1_internal
哪会保持你的代码漂亮,但稍后会让你感到困惑。不要那样做。
对于内部非锁定版本的函数使用前导下划线很常见,所以
static int _api1(void)
答案 3 :(得分:0)
您可以构建您的库,以便api2()
告诉api1()
它是调用方。从外部调用时,api1()
会看到一个未知来电者。