【发布时间】:2012-04-07 18:33:09
【问题描述】:
unordered_map<std::string,unordered_map<std::string, std::string> >* storing_vars;
我在作用域中声明了这个变量。
这是在构造函数中声明的。
this->storing_vars = new unordered_map<std::string,unordered_map<std::string, std::string> >();
为了初始化它。
然后我所做的就是由我的 BackgroundWorker 一遍又一遍地调用一个函数
for(int i2 = 0; i2 < 30; i2++){
int index_pos_curr = i2;
//Start the Threads HERE
this->backgroundWorker2 = gcnew System::ComponentModel::BackgroundWorker;
this->backgroundWorker2->WorkerReportsProgress = true;
this->backgroundWorker2->WorkerSupportsCancellation = true;
//this->backgroundWorker2->FieldSetter(L"std::string",L"test","damnnit");
backgroundWorker2->DoWork += gcnew DoWorkEventHandler( this, &MainFacebook::backgroundWorker2_DoWork );
backgroundWorker2->RunWorkerCompleted += gcnew RunWorkerCompletedEventHandler( this, &MainFacebook::backgroundWorker2_RunWorkerCompleted );
backgroundWorker2->ProgressChanged += gcnew ProgressChangedEventHandler( this, &MainFacebook::backgroundWorker2_ProgressChanged );
backgroundWorker2->RunWorkerAsync(index_pos_curr);
Sleep(50); //THE PROBLEM IS HERE, IF I COMMENT THIS OUT it won't work, that's probably because there are a lot of functions trying to add values in the same variable (even though the indexes are differents in each call)
}
完成此操作后,它会调用 DoWork 函数
void backgroundWorker2_DoWork(Object^ sender, DoWorkEventArgs^ e ){
BackgroundWorker^ worker = dynamic_cast<BackgroundWorker^>(sender);
e->Result = SendThem( safe_cast<Int32>(e->Argument), worker, e );
}
int SendThem(int index){
stringstream st;
st << index;
//...
(*this->storing_vars)[st.str()]["index"] = "testing1";
(*this->storing_vars)[st.str()]["rs"] = "testing2";
return 0;
}
当我在Sleep(50) 行中添加注释时,我认为问题在于,由于后台线程调用相同的函数,因此在多次调用时存储数据存在问题,甚至可能没有等待其他存储完成,这会导致“xhash.h”文件中出现错误,该错误已通过使用Sleep(50) 进行清理,但我无法使用这些,因为它会冻结我的 UI,而且 50 毫秒是时间我假设它已经存储了变量值,但是如果在较慢的计算机上需要更长的时间呢?这不是正确的方法。
我该如何解决这个问题?
我希望能够在不使用 SLEEP 的情况下更新 unordered_map
提前致谢。
【问题讨论】:
-
总结一下问题是因为您试图从两个不同的线程更新相同的 unordered_map 是否公平。您正试图通过添加睡眠来修复它?是这个问题吗?
-
你的同步机制在哪里?我没有看到....
-
不,我不想使用睡眠,我是说睡眠是我发现不会导致该问题的唯一方法,我希望它能够更新相同的 unordered_map 并且同时由不同的线程再次重复,而不会在文件“xhash”中抛出错误(可能来自 unordered_map 标头),所以我不想让它睡觉我希望它在没有睡眠的情况下工作
-
@Grego :互斥体或临界区。您在多线程上下文中使用线程不安全的类,您期望会发生什么?
-
@Grego:那是你的问题。你会在不知道方向盘是什么的情况下开车吗?你需要知道你在做什么。这包括知道什么是互斥锁和临界区,这意味着知道你正在使用的数据结构提供了什么(如果有的话)多线程保证
标签: c++ multithreading visual-c++ c++-cli backgroundworker