我需要Thread Lock对象吗?

时间:2010-12-07 16:30:18

标签: c# multithreading

嘿,我正在重构一个需要大量线程的程序。但是,我没有太多先前的线程经验,所以这是一个(我猜)我需要帮助的简单问题。

程序监视某些文件(每个观察者在不同的线程上运行),当检测到更改时,它会调用方法调用Notify()Notify()方法只是发送电子邮件。

如果两个或多个线程同时检测到更改,并同时调用Notify(),这是一个问题吗?

我猜测,因为Notify()没有访问任何无法多次打开的文件或任何此类事情,所以多线程调用Notify()应该没有问题同时。但我可能是错的。

如果我错了,在调用Lock(object)之前创建对象并使用Notify()是最好的方法吗?

3 个答案:

答案 0 :(得分:2)

如果多个线程需要访问共享状态(静态或非静态)并且其中一些线程试图更改,则需要锁定。如果他们所做的只是读取,那么他们可以安全来访问它。此外,如果你没有共享状态,那就没关系了。

答案 1 :(得分:2)

如果notify方法使用共享资源(如Notify()方法正在使用的静态变量),则可能存在一些线程问题并且可能需要锁定,否则将不会出现问题。

答案 2 :(得分:2)

您需要执行任何锁定的唯一原因是Notify()内的变量可能会被同时运行的多个Notify()实例更改。

因此,假设您有List<>个已检测到的文件(例如,为了防止重新通知),并且您的Notify()方法会将检测到的文件添加到List<> 。多个Notify()实例可能会同时尝试访问该列表,在这种情况下,您会考虑锁定(或以其他方式同步)List<>

从你所描述的情况来看,我认为你不必担心它。