The thread is queued disorderly when using netcore 3.1 in debug mode in VS.
- Dominant language
- PowerShell
- Stars
- 22k
- Forks
- 4.9k
- Avg merge
- 5d 5h
- Merged PRs (30d)
- 29
Description
## Issue Title
Same as title.
## Test environment
- .netcore 3.1(.netcore 2.x not tested)
- **Start new debug instance in vs studio: Not expected ❌.**
- Debug Build: no problem ✔.
- Release Build: no problem ✔.
- .NET Framework 4.7.1(other version not tested).
- Start new debug instance in vs studio: no problem ✔.
- Debug Build: no problem ✔.
- Release Build: no problem ✔.
## The reproducible code:
```csharp
using System;
using System.Collections.Concurrent;
using System.Threading;
namespace SignalTest
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 20; i++)
{
new Thread(new ThreadStart(new Worker($"c{i % 3}", $"name{i}").Start)).Start();
}
Console.ReadKey();
}
}
class Worker
{
public static ConcurrentDictionary Semaphores = new ConcurrentDictionary();
public string Name { get; set; }
public string Code { get; set; }
public int Count { get; private set; }
public Worker(string code, string name)
{
Code = code;
Name = name;
Semaphores.TryAdd(Code, new Semaphore(1, 1));
}
public void Start()
{
while (true)
{
try
{
WriteLog($"[{Code}][{Name}] Wait.");
Semaphores[Code].WaitOne();
WriteLog($"[{Code}][{Name}] Begin.");
WriteLog($"[{Code}][{Name}] Working => {++Count}!!!");
Thread.Sleep(500);
}
finally
{
WriteLog($"[{Code}][{Name}] Release.");
Semaphores[Code].Release();
}
}
}
public void WriteLog(string msg)
{
if (Code == "c1")
Console.WriteLine(msg);
}
}
}
```
The desired output should be all of the `c1-coded` threads printed 1, then print 2, then 3..., but in dotnetcore 3.1 (VS Debug instance, Debug > Start New Instance), the result may not be what you want, is that a bug?
One of the unwelcome output fragment may be:
```
[c1][name1] Working => 4!!!
[c1][name1] Release.
[c1][name1] Wait.
[c1][name4] Begin.
[c1][name4] Working => 4!!!
[c1][name4] Release.
[c1][name7] Begin.
[c1][name7] Working => 4!!!
[c1][name4] Wait.
[c1][name7] Release.
[c1][name7] Wait.
[c1][name10] Begin.
[c1][name10] Working => 2!!!
[c1][name10] Release.
[c1][name10] Wait.
[c1][name13] Begin.
[c1][name13] Working => 1!!!
[c1][name13] Release.
[c1][name13] Wait.
[c1][name16] Begin.
[c1][name16] Working => 1!!!
[c1][name16] Release.
[c1][name16] Wait.
[c1][name19] Begin.
[c1][name19] Working => 1!!!
```
Contributor guide
Assessment
This issue has not been assessed yet.