Я столкнулся с проблемой, что у меня есть объект C # (.NET), общий для некоторых потоков. Поток может заменить объект другим. Потоки пробуждаются от соединения TCP / IP с использованием асинхронной структуры.
Последовательность:
Потоки (ожидающие соединения) -> Асинхронный обратный вызов -> Сделать что-то поточно-безопасное ->
Доступ к общему объекту -> Сделать что-то поточно-безопасное.
1. Решение Mutex:
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
}
Что быстрее и лучше масштабируется?
Я ожидаю, что второе решение будет быстрее, если не будет опрашиваться одновременно много потоков. Второе решение может даже спать в произвольное время, чтобы опрос не занимал время обработки. Первое решение выглядит для меня чище, если мне действительно нужно обрабатывать много соединений TCP / IP. Поскольку в заблокированном разделе, посвященном обработке TCP / IP, я выполняю очень мало операций, будут ли проблемы с масштабированием?
Как насчет создания объекта в начале функции threadCallback ().
В моем C ++ фоне я всегда использовал пулы памяти в такой ситуации, поскольку я должен использовать безопасный .NET, есть ли быстрый способ создания новых объектов или платформа .NET хорошо работает в этой области.
С уважением,
Friedrich