【问题标题】:C# Is it possible to interrupt a specific thread inside a ThreadPool?C# 是否可以中断 ThreadPool 中的特定线程?
【发布时间】:2011-01-26 16:48:34
【问题描述】:

假设我已经在ThreadPool 中排队了一个工作项,但是如果没有要处理的数据(从BlockingQueue 读取),工作项就会阻塞。如果队列为空并且没有更多工作进入队列,那么如果我想中断阻塞任务,我必须调用Thread.Interrupt 方法,但是如何使用ThreadPool 做同样的事情?

代码可能如下所示:

void Run()
{
    try
    {
        while(true)
        {
            blockingQueue.Dequeue();
            doSomething();
        }
    }
    finally
    {
        countDownLatch.Signal();
    }
}

我知道在这种情况下最好的办法是使用常规的 Thread,但我想知道是否有 ThreadPool 等效的方式来中断工作项。

【问题讨论】:

    标签: c# multithreading concurrency threadpool interrupt


    【解决方案1】:

    那是哪个BlockingQueue?那是BCL类吗? TPL 类?还是定制?

    没关系;简单地说——我不会。您可以在线程生命周期的早期做一些事情来存储线程引用,但我根本不会使用ThreadPool 来完成这项工作,因为它听起来运行时间更长。普通的Thread 似乎更合适。

    我也很惊讶没有告诉队列释放所有工作人员的内置方法 - 我以前写过阻塞队列,我倾向于使用这种模式(例如,from here):

    public bool TryDequeue(out T value) {...}
    

    用这个:

    • 如果有数据立即返回真
    • 如果没有数据但添加了一些数据,则阻止并(最终)返回 true
    • 如果队列正在关闭,则阻塞并(最终)返回 false

    【讨论】:

    • 在短循环中测试的非易失性布尔变量(关闭),它总是有效吗?
    • @nobugz - 我相信 Monitor.Wait 会强制刷新;不过有趣的问题。
    • 锁定语句:是的,由于 try 块。 Monitor.Wait(),非常值得怀疑。它需要 JIT 来检测特定的方法。
    • @nobugz 请注意,Wait 调用了 ObjWait,即internalcall,因此它并不完全取决于 JIT;但我可能会提出这个问题。
    • @nobugz - 在这里提出:stackoverflow.com/questions/2431238/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多