現在、.NETでSystem :: Threading :: Interlockedクラスを使用してアトミック操作のみを使用しているC++ .netでスレッド同期を達成しようとしています。私はマルチスレッドではあまり経験がありません。私はロックレスのスレッド同期を使用しようとしています。現在、スレッド間で共有する必要がある静的変数を含む設定と呼ばれるクラスを作成しました。私は静的データメンバを設定する静的関数と静的データメンバを読み込む静的関数の2つを作成しました。現在のところ、これは私の静的同期関数のようなものです。 2つ以上のスレッドが同時にこの関数を入力すると、whileループで永遠にスタックすることがありますが、2つのスレッドだけがこの関数を必要とすることを理解しています、GUIスレッドと設定とディスパッチを読み込むメインスレッドワーカースレッドに作業します。アトミック操作のみを使用するC++/CLIのスレッド同期
//object is handle to instance of settings class that also contains non-static
//members that will contain each threads copy of the data.
void Settings::SetStaticVariables(Settings ^object)
{
int returnvalue;
//canchange variable is a static integer of the class "Settings"
returnvalue = Threading::Interlocked::Increment(Settings::canchange);
if(returnvalue > 1)
{
while(Settings::canchange > 1)
{
//perhaps eventually I will find an alternative to telling the thread
//to sleep for a defined amount of time, maybe when I learn how to use events
//for now this will do, speed is not very important for this data sync as
//it does not occure often
Threading::Thread::Sleep(50);
}
}
//data synchronization of static members here
//decrement allowing waiting threads to exit while loop
Threading::Interlocked::Decrement(Settings::canchange);
};
私の質問は、私が期待したり欠陥が同期のために、この全体的なアイデアである午前ものを私に与えることはありません不備が何も見えないのですか?
で次のようになります「私は、マルチスレッドでのすべての非常に経験豊富ではないと私はロックレススレッドの同期を使用しようとしています。」これは不十分に終了する可能性が高いです。正しいマルチスレッドコードを書くことは難しく、そうすることでロックフリーになるのは難しくなります。ロックを使用しようとしましたが、ロックが実際のパフォーマンスのホットスポットかどうかを確認するためにプロファイルしましたか? –
私はロックを使用しようとはしませんでしたが、コードのこのセクションでのパフォーマンスは重要ではないので、ロックを使用することができます。それが最善のルートだと思うなら、間違いなく使うことができます。ロックレスの同期を経験した方が良いと思ったのは、マルチスレッドに関する記事を読んでいたからです。ロックをできるだけ少なくすることが最善の方法です。また、私は最終的にスピードが問題になるコードを作成しようとしますが、今はロックに精通していると思います。 – contrapsych
@ジェームス:+1。もしできれば+10。 @ジェイク:ロックを避けることは一般的には良いことですが、もっと重要なのはロックフリーの同期を避けるというルールです - 具体的には、「あなたが何十年もの専門家でなければロックフリーの同期コードを書いてはいけません。マルチスレッドのプログラマーと高度な数学者があなたの仕事をチェックできる準備ができています」 –