我有两个线程,一个是接受TCP连接并处理requets,一旦处理完成,它就会在树中的记录上标记一个DELETE标志。 另一个线程基本上在这个树上执行gc,在遍历树的大型for循环中,如果设置了DELETE标志,则删除节点。在每个interation中,我有一个pthread_yield()只是为了防止这个gc线程使用太多的CPU;
现在的问题是,当这个树很大时,gc线程使用了太多的CPU,这反过来导致TCP线程的select()和epol.wait(0)返回时间太长,即使有已经连接等待。
现在,如果我将大的for循环分成更小的循环以使gc从最后一次运行的每次开始的地方开始,那么CPU占用问题似乎不再发生了。
为什么?
我可以用来编程记录/监控线程切换统计信息的任何API吗? linux框上没有valgrind或gcc编译器。