いくつかのスレッド間でC#(.NET)オブジェクトを共有しているという問題に直面しています。スレッドがオブジェクトを別のオブジェクトに置き換える場合があります。スレッドは、非同期フレームワークを使用してTCP/IP接続からウェイクアップされます。
順序:
スレッド(接続を待機中)->非同期コールバック->スレッドセーフな処理を実行->共有オブジェクトへのアクセス->スレッドセーフな処理を実行
1.ソリューションミューテックス:
Object sharedObject = new Object();
Mutex objectMutex = new Mutex();
void threadCallback()
{
Object newObject = new Object();
// some processing
objectMutex.lock();
// do exchange sharedObject with newObject if needed
// very little processing here
objectMutex.unlock();
// some processing
}
2.ソリューションインターロック
Object sharedObject = new Object();
int usingSharedObject = 0;
void threadCallback()
{
Object newObject = new Object();
// some processing
// poll until we lock
while(1 == Interlocked.Exchange(ref usingSharedObject , 1))
{
// do exchange sharedObject with newObject if needed
// very little processing here
Interlocked.Exchange(ref usingSharedObject , 0); // free lock
}
// some processing
}
何がより速く、より良くスケールアップしますか?
同時にポーリングするスレッドが多くない限り、2番目のソリューションの方が高速であると思います。2番目のソリューションは、ポーリングが処理時間を浪費しないように、ランダムな時間スリープする場合もあります。私が本当にたくさんのTCP/IP接続を処理する必要がある場合、最初の解決策は私にはきれいに見えます。TCP / IP処理に関して、ロックされたセクションではほとんど処理を行わないので、スケールアップの問題はありますか?
threadCallback()関数の開始時にオブジェクトを作成するのはどうですか。
私のC++のバックグラウンドでは、このような状況では常にメモリプールを使用していました。これは、安全な.NETを使用する必要があるためです。新しいオブジェクトをすばやく作成する方法があるか、この分野で.NETプラットフォームが適切に機能します。
よろしくお願いします、
フリードリヒ