如何判断一个函数是否被多个线程调用

3

我有一个C++函数,它被一个我无法访问其代码的框架调用。如果该框架从多个线程中调用此代码,则需要在许多位置放置互斥锁。如果没有,我不想承担互斥锁的性能损失。考虑到我可以通过框架运行代码,有办法确定框架是否从多个线程中调用该函数吗?


2
个人而言,我只会插入一些调试代码并将所有线程 ID 写入文件(当然,要使用互斥锁)。实际上,这不是真的。我会放置互斥锁,并在有人告诉我代码太慢时担心它。 - IdeaHat
2个回答

6
如果您使用的是c++11,可以使用std::this_thread::get_id()在每个函数调用时存储/记录此值。例如:
void my_func()
{
   std::cout << "my_func called from thread " << std::this_thread::get_id() << std::endl;
   ...
}

2
如果C++11不可用,每个操作系统都有一个本地函数来获取线程ID。 - rodrigo
1
这在一般情况下是不起作用的,线程 ID 可能会被回收并被新线程使用。 - quantdev
@quantdev 在单个进程中?我认为这只是一种理论上的可能性,并值得注意,所以谢谢,但并不是实际可能。我多年来一直使用上述技术来进行调试操作,并且从未被误导过。最坏的情况是:再次运行程序,雷电很可能不会两次打在同一个地方。 - Matt Phillips
即使它被回收,也只能在第一个线程退出后才能进行。你会谈论顺序线程。对于所述目的(确定是否使用了多个并发线程),打印ID就足够了,因为ID在任何时刻都是唯一的。 - MSalters
我认为这不足以检测函数的并发访问,这正是OP所询问的。它将显示调用该函数的线程,但访问可能是顺序而非并发的。 - j b

-2
Captain Obvlious'的评论非常重要:RTFM。如果您在文档中找不到指令,您可以使用std::this_thread::get_id(),就像Matt指出的那样。或者,如果您不想编辑任何代码,可以使用调试器
只需为您感兴趣的框架函数对应的符号设置断点并运行程序。优秀的调试器甚至可以接受正则表达式一次创建多个断点的命令。当程序停止时,只需查看线程ID,您就会知道是否有关键段。
以下是lldb和gdb设置带有正则表达式的断点的方法:
(lldb) breakpoint set --func-regex regular-expression
(gdb) rbreak regular-expression

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接