boost ::线程导致小事件处理泄漏?

我正在debugging这个数据库项目。 它为更高级别的应用程序封装了对SQLite的访问。 它被devise为asynchronous运行,也就是说,它有像ExecuteRequestAsync()和IsRequestReady()这样的方法。 当ExecuteRequestAsync被调用时,它产生一个boost :: thread来完成这个工作并立即返回该函数。 当高层应用程序决定不再需要运行请求的结果时,它可以调用DumpRequest()来取消它。 由于很难正常取消数据库请求,DumpRequest的实现只是维护一个“清理监视线程”,等待“已完成的请求”并将其删除。 所有的boost :: threads都是通过boost :: shared_ptr来pipe理的,比如:

boost::shared_ptr<boost::thread> my_thread = new boost::thread(boost::bind(&DBCon::RunRequest, &this_dbcon)); 

而当它不再需要(取消):

 vector<boost::shared_ptr<boost::thread> > threads_tobe_removed; // some iteration threads_tobe_removed[i].get()->join(); threads_tobe_removed.erase(threads_tobe_removed.begin()+i); 

我创build了这个unit testing项目来testing执行和转储请求的机制。 它运行请求并随机取消正在运行的请求,并重复数千遍。 机制certificate是可以的。 一切按预期工作。

但是,通过sysinternal的Process Explorer观察unit testing项目,发现存在句柄泄漏问题。 每过500英里,句柄数就增加1,永远不会返回。 这是正在增加的“事件”types句柄。 文件和线程句柄没有增加(当然,随着线程的产生,句柄的数量也在增加,但是每隔一百次就有一个Sleep(10000)调用等待它们被清理,以便可以观察句柄计数)。

我没有自己pipe理事件处理。 它们是在创build线程时由boost :: thread创build的。 我只保证优雅地closures线程,我不知道事件是用于什么。

我想知道有没有人遇到类似的问题? 什么可能是这个泄漏的原因? Process Explorer中的这个数字是否足够可靠,称之为句柄泄漏? 有什么方法可以追踪和修复吗?

我使用Visual C ++在Windows Vista上使用静态链接boost 1.40。

Solutions Collecting From Web of "boost ::线程导致小事件处理泄漏?"

线程安全性是否可以访问threads_tobe_removed ? 如果没有,那么当一个线程通过调用DumpRequest将一个线程添加到该向量时,可能会有一个竞争条件,而清除监视器线程从该向量中删除一个线程。 因此, boost::thread -objects可能会在不加入线程的情况下被销毁,从而导致线程运行时没有关联对象,这可能会导致泄漏。