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

时间:2014-03-14 09:31:19

标签: c++ multithreading boost

我创建了两个并行执行单个代码的线程。我想在两个线程完成执行时运行另一个方法。我已经尝试了join()和timed_join(),但是它没有工作。我我正在使用boost thread class。请在下面找到我的代码:

代码:

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();

让我知道如何使用线程并行执行method1然后我必须调用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查询。谢谢

1 个答案:

答案 0 :(得分:2)

根据您的评论,听起来您的db成员不是线程安全的。例如,当您在其上调用endTransaction时,无法知道要结束的交易。

您有三种选择,其中一些可能不起作用,具体取决于您尚未提供的详细信息:

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

  2. 数据库对象可以返回&#34;事务&#34;后续函数采用的对象。每个线程都可以分配自己的事务对象。

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

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