class1有两种方法,do1和do2。 它从同一应用程序中的多个线程实例化。同步两种方法并避免同时运行
我需要同步两种方法与此规格:
DO1只能在时间1个线程执行,锁将是一个很好的解决方案。
do2可以同时从多个线程调用,但 do1运行时不能调用。
当do1被调用时,evary线程必须等待do1完成之后才能启动do2。
谢谢。
class1有两种方法,do1和do2。 它从同一应用程序中的多个线程实例化。同步两种方法并避免同时运行
我需要同步两种方法与此规格:
DO1只能在时间1个线程执行,锁将是一个很好的解决方案。
do2可以同时从多个线程调用,但 do1运行时不能调用。
当do1被调用时,evary线程必须等待do1完成之后才能启动do2。
谢谢。
基本上有两种方法可以实现这一点。一种是使用信号量,一种方法是采用一种方法获取所有可用的插槽,另一种采用每次执行尝试使用一个插槽的方法。然而,这有点破解,你真正需要的是一个允许独占和非独占锁定的同步对象。
这就是ReaderWriterLock
和ReaderWriterLockSlim
所做的。它们适用于需要对资源进行独占写入访问但对资源进行非专有读取访问的情况,并且适用于以下场景:
ReaderWriterLockSlim m_lock = new ReaderWriterLockSlim();
public string do2()
{
m_lock.EnterReadLock();
try
{
// Do work, many threads can enter this lock at the same time
}
finally
{
m_lock.ExitReadLock();
}
}
public void do1()
{
m_lock.EnterWriteLock();
try
{
// Do work, only one thread can be in here at once
}
finally
{
m_lock.ExitWriteLock();
}
}
如果我正确理解了这个问题,可以通过简单地使用私有静态锁定对象来同步方法来解决问题,这可以按如下方式完成。
public class c1
{
private static iLock = new object();
public void do1()
{
lock (iLock)
{
// actual method body
}
}
public void do2()
{
lock (iLock)
{
// actual method body
}
}
}
此解决方案同步do2,如果没有人正在调用do1,可以同时调用do2。 – FDB
这是你的功课吗?你试过什么了? –
听起来像你想要的东西像'ReaderWriterLockSlim' - 你看过吗? –
如果它是一个真正的项目,而不是一个学校,请看看我的帖子。 http://pilpag.blogspot.dk/2016/04/advanced-programming-easy-way-to-manage.html –