c - 我如何检查这个函数是从哪个文件调用的?

标签 c

看到我有一个库,它有两个 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/

相关文章:

c - 如何重复 scanf() n 次?

c - ncurses 不解释键

c - 用随机字母填充二维数组-C编程

在 C++ 中将 NULL 转换为 void

c - 可变参数异构免费宏

c - 将 char *[] 数组传递到采用参数 const char ** 的函数中

c - XmMULTIBYTE_TEXT 或 XmWIDECHAR_TEXT 模式下的 XmStringGenerate()

计算C中线程的运行时间

c - 将巨大的数据库加载到内存中 visual c

c - 从文件中读取并存储在数组中