Mik*_*scu 7 .net multithreading
我正在编写一个特殊的数据结构,它将在.NET库中可用,并且该数据结构的一个特性是线程安全的,前提是只有一个线程向其写入数据,并且只有一个线程从中读取数据它(读者线程和作者线程可以不同).
问题是如何强制所有Read操作都由同一个线程执行?
我的解决方案是捕获System.Threading.Thread.ManagedThreadID并在第一次读取时将其存储在私有成员中.然后,在后续读取时检查ManagedThreadID与已保存的ManagedThreadID,如果它们不同则抛出异常.
这还不够,或者是否有一种不同的更可靠的机制来做到这一点.
注意:要求此库在没有Windows.Forms上下文的情况下可用.
当我遇到这种情况时,我使用了一个名为ThreadAffinity的类.它的全部目的是记录当前线程并抛出来自不同线程的无效访问.您必须手动执行检查,但它会为您封装少量工作.
class Foo {
ThreadAffinity affinity = new ThreadAffinity();
public string SomeProperty {
get { affinity.Check(); return "Somevalue"; }
}
}
Run Code Online (Sandbox Code Playgroud)
类
[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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
关于这个主题的博客文章:
归档时间: |
|
查看次数: |
1888 次 |
最近记录: |