-3
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を更新できるようにしたい

前もって感謝します。

4

3 に答える 3

3

一度に1 つのスレッドunordered_mapからのみ、標準ライブラリ コンテナー (を含むが、これに限定されません) を変更できます。解決策は、クリティカル セクション、ミューテックス、ロックを使用してアクセスを同期することです。これらが何であるかわからない場合は、複数のスレッドを作成する前に知っておく必要があります。

もしも、しかし、または理由はありません。

複数のスレッドがある場合は、共有データへのアクセスをシリアル化するために、それらを同期するメカニズムが必要です。一般的な同期メカニズムは上記のものですので、調べてみてください。

于 2012-04-07T21:30:54.680 に答える
2

非常に多くの票を投じた後、私は実際にMutexを探し始めました。人々はここで話していましたが、しばらくすると、それが本当に簡単に使用できることがわかりました。そして、ここの私の仲間が私に言ったように、それは正しい方法です。助けてくれてありがとう=D

ここで私がしたこと、私はただ追加する必要がありました

//Declare the Mutex
static Mutex^ mut = gcnew Mutex;

//then inside the function called over and over again I used mutex
mut->WaitOne();
//Declare/Update the variables
mut->ReleaseMutex();
//Then I release it.

それは完璧に機能します、助けと批判をありがとうございました。はは

于 2012-04-08T20:31:17.510 に答える
-4

使用したいunordered_mapのインデックスを事前定義することで1つの解決策を見つけました。問題はインデックスを作成するだけで、更新は複数のスレッドで問題ないようです。

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;
                backgroundWorker2->DoWork += gcnew DoWorkEventHandler( this, &MainFacebook::backgroundWorker2_DoWork );
                backgroundWorker2->RunWorkerCompleted += gcnew RunWorkerCompletedEventHandler( this, &MainFacebook::backgroundWorker2_RunWorkerCompleted ); stringstream st; st << index_pos_curr;

                (*this->storing_vars)[st.str()]["index"] = ""; 
               //This ^^^^^ will initialize it and then in the BackgroundWorker will only update, this way it doesn't crash. :)

                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)
            }
于 2012-04-07T21:21:22.057 に答える