看到我有一个库,它有两个 api 可以调用
api1()
和
api2()
现在 api2 内部也调用 api1。
所以在一种情况下我想做的是
- 当一些其他应用程序调用 api1() 时,然后做一些特殊的工作
- 但是当 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,因为它会造成死锁 ...
我需要一些机制让 api1() 检查它是否被 api2() 调用,然后不要使用 sem_wait 和 sem_post
最佳答案
这不容易通过内省(introspection)来实现。您可以调查调用堆栈,但这非常不可移植,确实不推荐。
处理此问题的一种方法是传递一个参数来控制行为的变化。这具有使函数的行为更加透明和明确的额外好处。正如@blueshift 指出的那样,这会给外部调用者带来负担。将该功能拆分为两个版本,一个供内部使用,一个供外部使用,减轻了这一负担。
根据您的编辑,我认为设计有一点偏差。同步责任应该在函数内部或外部。让这种责任有时在内部有时在外部是非常冒险的。那将是解决问题的一种方法。另一种解决方法是使用递归锁。
关于c - 我如何检查这个函数是从哪个文件调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8150057/