我正在使用valgrind运行多线程套接字程序。客户端将通过TCP向服务器发送请求,然后忙于等待布尔值。当调用服务于服务器响应的回调函数时,布尔值将被设置。一旦接收到响应(并设置了布尔标志),服务器将再次发出请求,并在循环中重复执行此操作。我知道对共享变量(布尔值)的非同步访问可能会导致线程问题,但我尝试过使用pthread互斥体,并且程序减速了大约20%(这里速度很重要)。我相信写入共享布尔变量是好的,因为它可以在一个周期内完成。valgrind在多线程套接字程序中失速
该程序在valgrind之外运行良好,但通常在使用valgrind运行时会停止运行。我离开程序在一夜之间运行..通常需要几秒钟才能完成,所以我不认为这是一个等待程序完成的时间不够的情况。线程由开源引擎框架(快速修复)管理,所以我认为这不是线程创建/管理的问题。
有没有人知道valgrind围绕多线程程序/繁忙的等待循环/套接字通信(或这些组合)的任何问题?
忙于等待共享布尔变量不是“在单个循环中完成”,它在每个循环迭代中以几个周期完成,并且如果您的忙循环等待TCP网络上的往返行程,则循环可能会迭代数十亿次(因此浪费数十亿个CPU周期,可能在其他地方更好使用)。比你提到的任何一个更好的解决方案是等待一个条件变量,并让回调函数发出条件变量的信号,以在数据准备就绪时唤醒你的线程。 – 2011-12-29 01:48:26
我在说写入布尔变量是在一个周期内完成的(而不是整个繁忙的等待过程)。话虽如此,我应该说写入布尔变量是自动完成的(因为缓存未命中等可以推动单个字节的写入超过单个CPU周期) – Taras 2011-12-29 05:18:35
什么Jeremy说 - 忙等待是一个坏主意,条件变量是更好的,并且不太可能会变慢... – BillT 2014-03-31 17:22:30