线程只阻止第一个线程(尝试二)

时间:2010-07-10 16:51:38

标签: c# multithreading

之前我曾问过这个问题 - 但我花了一些时间思考它并实施了一个工作版本。

概述
1)正在创建线程以执行某项任务 2)一次只有一个线程可以执行任务 3)每个线程执行完全相同的任务。 (系统上有一堆检查和验证)
3)创建线程的速度比执行任务的速度快。 (我无法控制线程创建)

结果是超时我得到了积压的线程来执行任务。

我实施的内容如下 1)线程检查以查看有多少活动线程 2)如果有0个线程,则将其标记为PerformTask并启动任务
3)如果有1个线程,它被标记为PerformTak并且它阻止
4)如果有超过1个线程,则线程未标记为PerformTasks并且已经死亡

这个想法是,如果有一个线程等待执行任务我就是杀死线程。

以下是我提出的代码

              bool tvPerformTask = false;

              ivNumberOfProcessesSemaphore.WaitOne();
              if (ivNumberOfProcessesWaiting == 0 ||
                  ivNumberOfProcessesWaiting == 1)
              {
                ivNumberOfProcessesWaiting++;
                tvPerformTask = true;
              }
              ivNumberOfProcessesSemaphore.Release();

              if (tvPerformTask)
              {
                //Here we perform the work
                ivProcessSemaphore.WaitOne();
                //Thread save

                ivProcessSemaphore.Release();


                ivNumberOfProcessesSemaphore.WaitOne();
                ivNumberOfProcessesWaiting--;
                ivNumberOfProcessesSemaphore.Release();
              }
              else
              {
                //we just let the thread die
              }

我遇到的问题并不是它不起作用只是因为我没有找到特别优雅的代码我不太高兴我需要2个信号量一个整数和一个本地标志来控制它。如果有办法实现这个或模式会使代码更简单。

2 个答案:

答案 0 :(得分:1)

这个怎么样?

private readonly _lock = new object();
private readonly _semaphore = new Semaphore(2, 2);

private void DoWork()
{
    if (_semaphore.WaitOne(0))
    {
        try
        {
            lock (_lock)
            {
                // ...
            }
        }
        finally
        {
            _semaphore.Release();
        }
    }
}

答案 1 :(得分:0)

考虑使用ThreadPool而不是尝试自己管理单个线程的创建和销毁。