[英]Threading only block the first thread (Attempt Two)
我之前已經問過這個問題 - 但是我花了一些時間思考它並實現了一個工作版本。
概觀
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();
}
}
}
考慮使用ThreadPool而不是嘗試自己管理單個線程的創建和銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.