gpt4 book ai didi

c# - 线程只阻塞第一个线程(尝试二)

转载 作者:行者123 更新时间:2023-11-30 18:08:24 24 4
gpt4 key购买 nike

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

概览
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 个信号量、一个整数和一个本地标志来控制它。如果有一种方法可以实现此模式或使代码更简单的模式。

最佳答案

这个怎么样?

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();
}
}
}

关于c# - 线程只阻塞第一个线程(尝试二),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com