multithreading - valgrind 在多线程套接字程序中停滞

标签 multithreading valgrind

我正在使用 valgrind 运行多线程套接字程序。客户端将通过 TCP 向服务器发送请求,然后忙等待 bool 值。当调用服务于服务器响应的回调函数时,将设置 bool 值。一旦收到响应(并且设置了 bool 标志),服务器将再次发出请求,并在循环中重复执行此操作。

我意识到对共享变量( bool 值)的非同步访问会导致线程问题,但我尝试使用 pthread 互斥锁,并且程序速度降低了大约 20%(速度在这里很重要)。我相信写入共享 bool 变量很好,因为它可以在一个周期内完成。

该程序在 valgrind 之外运行良好,但在与 valgrind 一起运行时经常会停止。我让程序在一夜之间运行..通常需要几秒钟才能完成,所以我认为这不是等待程序完成时间不够长的情况。线程由开源引擎框架(快速修复)管理,所以我认为线程的创建/管理方式不是问题。

有谁知道 valgrind 在多线程程序/繁忙的等待循环/套接字通信(或这些的组合)方面有任何问题吗?

最佳答案

虽然其他答案侧重于坚持您采用标准同步方法(我完全同意这一点),但我认为我应该回答您关于 Valgrind 的问题。

据我所知,在多线程环境中运行 Valgrind 没有问题。我相信 Valgrind 会强制应用程序在单核上运行,但除此之外,它不应影响您的线程。

Valgrind 可能对您的应用程序所做的事情正在改变线程之间的时间和交互,这些方式可能会暴露您在独立运行时通常不会看到的代码中的错误和竞争条件。

在我看来,您用于确定错误不能出现在您正在使用的开源线程框架中的相同逻辑也适用于 Valgrind。我建议您将这些挂起视为代码中的错误并对其进行调试,因为它们很可能就是这样。

作为旁注,对于您描述的问题,使用互斥锁可能有点过分。您应该改为研究信号量或条件变量。

祝你好运。

关于multithreading - valgrind 在多线程套接字程序中停滞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8663148/

相关文章:

memory-leaks - Valgrind 显示内存泄漏,但没有发生内存分配

c# - C#:并行形式,多线程和 “applications in application”

java - 在有等待任务时动态调整 java.util.concurrent.ThreadPoolExecutor 的大小

c# - 多个线程向 ListBox 添加和删除项目

java - 如何使这个线程安全

c - Valgrind Memcheck for PostgreSQL C 函数

c++ - 最大用户模式调度程序线程数

c - 2 dl-hack3-cond-1 抑制了 valgrind -v 显示的错误

memory-leaks - Valgrind 可以显示泄漏内存的值吗?

c - 临时为算术转换 void* 的正确方法是什么?