1

私はミューテックスのチュートリアル/例をグーグルで調べてきましたが、必要な状況に合ったものを見つけることができないようです(または、おそらく私はそうしましたが、現時点では完全に理解していないため、自分の状況に適用する方法を理解していませんでした)。

2つのコールバック関数を持つC++dllがあります。コールバック関数は、サードパーティのプログラムから呼び出されます。各コールバック関数は、グローバル変数(個別のグローバル変数)に情報を追加します。これらのグローバル変数をそれぞれ使用する他の2つの関数があります。

サードパーティのプログラムには多くのスレッドがあるため、コールバック関数が常に呼び出されています。他の2つの関数は、ユーザーが手動で呼び出します。グローバル変数は、一度に2つのものからアクセスされることになり、クラッシュを引き起こします。

現在、グローバル変数は次のようなクラスにあります

 class Global
{
public:
static CString &  get_allscores() {  static CString get_allscores; return get_allscores; }
static CString &  get_allplayers() {  static CString allplayers; return allplayers; }
};

誰かが、これらのグローバル変数の1つにアクセスしている2つの関数でmutexを使用する方法の簡単な例を教えてもらえますか?

ありがとう

編集:

このような状況はどうですか

CString allchat; //global variable

void function1()
{
    allchat += "test";
}

void function2()
{
    cout << allchat;
}

これらの関数が多くのスレッドによって繰り返し呼び出され、順序が狂っている場合、ミューテックスオブジェクトを追加して、マルチスレッドに対応させることはできますか?

これまでの私の計画は、プログラムの起動時に所有者なしでミューテックスを作成することでした。その後、各関数が呼び出されると、所有権を取得し、関数の最後に解放します。これは正しい方法ですか?

4

1 に答える 1

1

答えの編集された部分に関して:はい、これらがグローバルデータにアクセスする唯一の関数である場合、両方の関数にミューテックスロックを追加すると、コードスレッドが安全になります。もちろん、危険なのは、コードの開発と保守の過程で、このグローバルデータをミューテックスで保護する必要があることを忘れていることです。もちろん、この問題の解決策は、コードを記述どおりに取得してクラスにラップすることです。これallchatはプライベートメンバーであり、クラスにミューテックスを追加し、にアクセスする任意のメンバー関数からミューテックスを使用しますallchat

于 2012-08-22T01:37:48.333 に答える