我创建了两个并行执行单个代码的线程。我想在两个线程完成执行时运行另一个方法。我已经尝试了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查询。谢谢
答案 0 :(得分:2)
根据您的评论,听起来您的db
成员不是线程安全的。例如,当您在其上调用endTransaction
时,无法知道要结束的交易。
您有三种选择,其中一些可能不起作用,具体取决于您尚未提供的详细信息:
每个线程都可以拥有自己的数据库对象。
数据库对象可以返回&#34;事务&#34;后续函数采用的对象。每个线程都可以分配自己的事务对象。
数据库对象可以将操作与调用它的线程相关联,因为知道endTransaction
结束了同一个线程启动的事务。
如果您要同时从多个线程调用数据库,则数据库必须是线程安全的。