使用 boost 库编写多线程程序时出错

Posted

技术标签:

【中文标题】使用 boost 库编写多线程程序时出错【英文标题】:Error while coding a multi threaded program with boost library 【发布时间】:2014-03-14 09:31:18 【问题描述】:

我创建了两个线程,它们将并行执行一段代码。我想在两个线程完成执行后运行另一个方法。我尝试过 join() 和 timed_join(),但它不起作用。我我正在使用 boost 线程类。请在下面找到我的代码:

代码:

A class:
A a;
boost::thread t(boost::bind(&A::method1,&a,s1,e1));//Call method1 using two parameters     s1 and e1.boost bind is used to call class methods
boost::thread t1(boost::bind(&A::method1,&a,s2,e2));//Call method1 using two parameters   s2 and e2.boost bind is used to call class methods.
t.join();
t1.join();
methodToBeExecutedAfterThreadExec();

让我知道如何使用线程并行执行方法 1,然后我必须调用 methodToBeExecutedAfterThreadExec() 方法。

提前致谢。

编辑 1:

void method1(int start,int end)

    vector< vector<string> >::iterator row;
vector<string>::iterator col;
db.onAutoVacuumMode();//Vacuum mode is set to true which eliminates fragmentation
db.startTransaction();//Starts the transaction which does the stuff in a batch wise
for (row = dupViewResults.begin()+start; row != dupViewResults.begin()+end; ++row) 

    std::string filedata=readFileDataInStr(row->at(0));
    int x = boost::lexical_cast<int>( row->at(1) );
    long long int fileCRC32=MurmurHash(filedata.c_str(),x,0);
    std::string strCRC32=std::to_string(fileCRC32);
    std::string query="update duplicatesview set CRC32='"+strCRC32+"' where Filepath='"+row->at(0)+"'";
    char* charQuery = &query[0];
    db.fireSQLQuery(charQuery,results); 
 
 db.endTransaction();

上面的代码将读取向量 dupViewResults(我的代码已经填充了它)然后更新视图,然后在事务中触发 sql 查询。谢谢

【问题讨论】:

“它不工作”不是一个有用的问题描述。您的代码看起来不错。 __debugbreak() 类 dbgrptt.c 在第二次连接中被命中。不知道为什么。 可能是因为 method1 或其调用的某些函数以不安全或不正确的方式被调用。给我们足够的代码来重现问题。 已添加。感谢您的帮助。 db 对象是否自动将事务与线程关联?如果不是,它如何知道调用endTransaction 时哪个事务正在结束? 【参考方案1】:

根据您的 cmets,听起来您的 db 成员不是线程安全的。比如你在它上面调用endTransaction,它无法知道结束哪个事务。

您有三个选择,根据您未提供的详细信息,其中一些可能不起作用:

    每个线程都可以有自己的数据库对象。

    数据库对象可以返回后续函数采用的“事务”对象。每个线程都可以分配自己的事务对象。

    数据库对象可以将操作与调用它的线程相关联,因为知道endTransaction 会结束由同一线程启动的事务。

如果要同时从多个线程调用数据库,则数据库必须是线程安全的。

【讨论】:

嗨大卫,我发现了错误。当我尝试将偏移量添加到向量时,我从 method1() 接收它。错误:向量迭代器 + 偏移量超出范围。

以上是关于使用 boost 库编写多线程程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

boost 链接出错无法打开libboost_thread-vc140-mt-sgd

关闭 MFC 对话框时的多线程对象破坏

boost多线程库使用指南

boost库之多线程

boost库:多线程

boost库 线程使用