我面临的问题是,我在一些线程之间共享了一个 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
}
什么是更快并且可以更好地扩展?
只要没有太多线程同时轮询,我希望第二种解决方案会更快。第二种解决方案甚至可以随机休眠,这样轮询就不会占用任何处理时间。如果我确实需要处理大量 TCP/IP 连接,第一个解决方案对我来说看起来更简洁。由于我在关于 TCP/IP 处理的锁定部分中进行的处理很少,是否会有任何扩展问题?
在 threadCallback() 函数的开头创建对象怎么样。
在我的 C++ 背景中,我总是在这种情况下使用内存池,因为我必须使用安全的 .NET,有没有一种快速的方法来创建新对象或者 .NET 平台在这个领域表现良好。
此致,
弗里德里希