我目前正在开发一个 C#应用程序,它使用两个单独的线程,第一个是程序运行的主线程,第二个是日志线程。日志线程基本上是一个循环,每隔一秒左右运行,并且仅在应用程序关闭时才会中断。
基本上,每隔一秒左右,如果要输出消息,则日志线程会写入日志文件(文本文件)。我的问题是,在主线程上我有一个移动功能,它可以改变日志文件(和其他文件)的路径,并将旧文件移动到新位置。我的问题是,如果日志线程写入日志文件并且移动函数尝试移动文件,反之亦然,会发生什么?我将如何帮助防止这种情况发生?
如果我没有更改保存路径,程序运行正常,但我担心如果主线程和日志线程都试图同时对日志文件执行某些操作,则主线程和日志线程可能会死锁。我已经对此做了一些研究,但我能想到的是同时阻止多个线程读/写文件的方法,而不是移动文件并像我一样写入文件。那么,是否有一些方法可以让日志线程告诉主线程它正在使用日志文件,主线程可以在完成时使用日志文件,反之亦然?
多线程是我一直想尝试的东西,但总是被这样的事情的复杂性所拖延。它当然需要更多的逻辑来阻止事情出错。
帮助将不胜感激,因为这是应用程序为防止大量错误而需要的最后一件事(至少我可以说,这是真正的测试)。
编辑: 我真正想要的是这两个线程可以通过某种方式进行通信"告诉对方他们何时访问日志文件,以便他们不会同时尝试访问同一个文件。
答案 0 :(得分:0)
只要主线程需要复制文件,然后在之后启动一个新的日志线程,我就会一起杀死你的日志线程。
答案 1 :(得分:0)
您的问题指导方向错误,如果您解释了最终目标,可能会得到更好的答案。
通常情况不同。多个线程登录到内存缓冲区。每个线程都有自己的缓冲区,因此没有缓冲区争用。当线程的缓冲区已满时,将创建一个新缓冲区并与完整缓冲区交换。记录继续到新缓冲区,而旧缓冲区被发送到一个线程,其目的只是将缓冲区写入文件并旋转日志文件。这允许多个线程非常快速地登录内存。由于它只是一个实际与文件交互的线程,因此文件移动操作没有冲突。
关于你的问题,假设文件移动不经常发生,你可以使用一个超薄的多个读取器,单个写入器锁https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim%28v=vs.110%29.aspx来实现(如果你有多个线程记录,只有一个移动文件),否则如果你只有两个线程,普通的锁(obj)语句就足够了。