【问题标题】:How to properly synchronize these threads?如何正确同步这些线程?
【发布时间】:2016-10-31 13:45:11
【问题描述】:

我正在尝试正确处理网络应用程序中的文件。下载文件时,我锁定了一个对象:

lock(lockObject)
{
   //Download file here.
}

因此,如果在下载过程中同一文件即将从另一个线程中删除,“删除”线程会先等待“下载”线程完成:

lock(lockObject)
{
   //Delete file here.
}

这可行,但存在另一个问题:两个线程无法同时下载文件。

如何使多个线程可以同时运行“下载”代码,但同时在“下载”线程完成之前不允许任何线程运行“删除”代码?

我知道答案在 Monitor 类的某个地方,但我不知道如何解决。

【问题讨论】:

  • 目前尚不清楚下载线程如何分配下载单个文件的任务......但是,无论如何,您可能会有一个管理器线程持有锁并将工作分配给它以某种方式线程池。这样,删除线程可以等待管理器线程持有的锁,但管理器线程可以对其工作池做任何它想做的事情。除非你的问题是别的意思?这不是很清楚......更多细节会有所帮助。
  • @J... 我不确定你在问什么。当用户发出 HTTP 请求时,下载代码由 .NET 提供的线程池中的常规线程运行。删除代码由服务器端的清理作业运行,该作业每小时运行一次。无论如何,我认为这些都不重要。
  • 不,答案不在Monitor 类中。您可能会使用ReaderWriterLockSlim 来允许多个下载线程,但强制删除线程等待所有下载线程完成。不过,我不清楚为什么要在下载文件后立即删除它,或者如何让两个不同的线程下载同一个文件。
  • @AxiomaticNexus 不清楚这是一个服务器应用程序,您的“下载”线程实际上是同时上传。这极大地改变了问题的含义。
  • @JimMischel Omron 这样做...“上传”的意思是 “从 PLC 获取程序”...让我抓狂。

标签: c# multithreading locking monitor


【解决方案1】:

ReaderWriterLockSlim 可能会满足您的需求。基本上,您将下载线程视为读取器,将删除线程视为写入器。您可以拥有任意数量的读者,但任何作家都需要独占访问权限。因此,如果在 delete 方法调用 EnterWriteLock 时正在下载任何文件,则删除线程将不得不等待所有当前下载完成。

ReaderWriterLockSlim theLock = new ReaderWriterLockSlim();

void Delete(filename)
{
    theLock.EnterWriteLock();
    try
    {
        // do delete stuff here
    }
    finally
    {
        theLock.ExitWriteLock();
    }
}

void Download(filename)
{
    theLock.EnterReadLock();
    try
    {
        // do delete stuff here
    }
    finally
    {
        theLock.ExitReadLock();
    }
}        

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2021-10-30
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多