我正在编写一种特殊的数据结构,该数据结构将在 .NET 库中可用,该数据结构的特点之一是,如果只有一个线程向其写入数据,并且只有一个线程从中读取数据,那么它将是线程安全的它(读取器线程和写入器线程可以不同)。
问题是如何强制所有读取操作都由同一线程执行?
我的解决方案是捕获 System.Threading.Thread.ManagedThreadID 并在第一次读取时将其存储在私有成员中。然后,在后续读取时对照已保存的 ManagedThreadID 检查 ManagedThreadID,如果不同则引发异常。
这是否足够,或者是否有其他更可靠的机制可以做到这一点?
注意:要求该库可以在没有 Windows.Forms 上下文的情况下使用。
当我遇到这种情况时,我使用了我编写的一个名为 ThreadAffinity 的类。它的全部目的是记录当前线程并抛出来自不同线程的无效访问。您必须手动进行检查,但它为您封装了少量工作。
class Foo {
ThreadAffinity affinity = new ThreadAffinity();
public string SomeProperty {
get { affinity.Check(); return "Somevalue"; }
}
}
Class
[Immutable]
public sealed class ThreadAffinity
{
private readonly int m_threadId;
public ThreadAffinity()
{
m_threadId = Thread.CurrentThread.ManagedThreadId;
}
public void Check()
{
if (Thread.CurrentThread.ManagedThreadId != m_threadId)
{
var msg = String.Format(
"Call to class with affinity to thread {0} detected from thread {1}.",
m_threadId,
Thread.CurrentThread.ManagedThreadId);
throw new InvalidOperationException(msg);
}
}
}
关于该主题的博客文章:
- http://blogs.msdn.com/jaredpar/archive/2008/02/22/thread-affinity.aspx http://blogs.msdn.com/jaredpar/archive/2008/02/22/thread-affinity.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)