【发布时间】:2015-10-17 18:30:34
【问题描述】:
我在大型代码库上工作,并且在进行分析时,大部分时间都花在了锁争用和在地图中进行查找上。该系统是一个实时系统,由来自传入数据流的回调驱动。许多线程得到回调。 (许多消费者)。
通常使用字符串(键)调用回调函数,然后从回调中调用许多函数。这些函数本身调用了许多函数。
其中许多函数或这些函数的子函数都会进行查找,通常每次都查找相同的字符串。 (最初传递给回调的字符串)。
明显的优化是进行一次查找,然后将找到的内容作为参数传递给调用链。但问题是这将涉及更改大量代码和函数签名。
因此一种解决方案是在回调函数中将查找值保存在全局结构映射 threadid 到查找值。 Threadid 是一个 int 且线程数小于 100,因此查找线程 id 比查找字符串更快。
这种技术有名字吗?它就像一个在调用链顶部被清除的线程缓存。
【问题讨论】:
-
我不知道您对设计更改有多开放,但同样更快的解决方案是使用thread-local variables 用关键字
thread_local声明。那么你根本不需要发明并发数据结构。 -
我会对此进行调查。谢谢你。我可以进行一些设计更改,但我大部分时间都在推动我开发新功能。
-
线程局部变量(如果可用)比您建议的解决方案需要更少 的设计更改。它们更快,因为它们被认为是针对以线程 ID 为键的数据的特定情况,因此对它们有特殊的编译器、链接器和处理器支持。它们使用起来更简单,因为您不需要编写代码然后访问自制数据结构根本(因此与它相关的所有代码都消失了):相反,您可以简单地直接读取并分配给变量,就好像它是一个全局变量一样,只是每个线程都有自己的副本。原型示例是
errno。 -
我调查了本地线程并同意这是要走的路。
标签: c++ multithreading optimization data-structures