【发布时间】:2013-01-23 10:31:54
【问题描述】:
我有一个多线程运行上下文。我希望一个资源(比如说对象 r)是互斥的。我可以将资源本身用作其监控对象吗?
例如
lock(r)
{
// do something...
}
【问题讨论】:
标签: c# multithreading locking mutual-exclusion
我有一个多线程运行上下文。我希望一个资源(比如说对象 r)是互斥的。我可以将资源本身用作其监控对象吗?
例如
lock(r)
{
// do something...
}
【问题讨论】:
标签: c# multithreading locking mutual-exclusion
如果 r 始终保持同一个对象 - 例如,r 是一个 List,您要从多个线程中添加项目:
lock (r)
{
r.Add("Hello world");
}
那么这很好 - 它不会引起任何问题,您可以阅读它,因为您专门“锁定r”。 (只要确保在使用r 的任何其他代码周围放置一个类似的lock。)
但是,如果r 被切换为lock 内的另一个对象:
lock (r)
{
r = new List<string>();
}
这不是一个好主意,因为您最终可能会在两个不同版本的r 上运行lock 的两个线程。在这种情况下,您应该创建一个不变的object 专门用于锁定 - 您更多的是“锁定代码块”而不是“锁定r”。
【讨论】: