代码之家  ›  专栏  ›  技术社区  ›  devlord

作为成员传递给线程类instance=bug的静态信号量?

  •  0
  • devlord  · 技术社区  · 16 年前

    在此模型中,至少有一个静态“计时器”类,由 System.Timers.Timer ,从数据库中检索要处理的数据批。A. Semaphore 初始化为静态成员。检索一批工作后,将生成一个新的工作线程实例来处理每一行或列表项,线程由父计时器类的静态信号量管理。

    internal class BatchTimer
    {
      private static Semaphore m_sem = new Semaphore(Settings.Default.ThreadCount, 
         Settings.Default.ThreadCount);
      private static System.Timers.Timer m_timer = new System.Timers.Timer();
    
      internal static void DoWork(object source, ElapstedEventArgs e)
      { 
        List<WorkRow> work = Work.GetBatch(Settings.Default.ObjectsPerIteration);
        foreach (WorkRow row in work)
        {
          WorkerThread worker = new WorkerThread
          {
            Semaphore = m_sem,
            Work = row
          };    
          Thread thread = new Thread(worker.Run);
          // Release() is called in finally block of WorkerThread.Run.
          m_sem.WaitOne(); 
          thread.Start();
        }
      }
    }
    

    信号量 这不会阻止垃圾收集吗?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Yann Schwartz    16 年前

    worker获得了对互斥体的引用,但只有在相反的情况下才会出现问题(使用一个静态变量保存对worker的引用)。

    所以,基本上,GC会照顾你的员工。

    如果你的一个工人堵车,你可能会遇到麻烦。你最终会有一个车队,或者更糟糕的是,如果你所有的工人都被困在那里,根本没有工作做。我会在worker中实现一个超时,以确保它不会阻塞整个进程。