dotnet / dotnet/core

The thread is queued disorderly when using netcore 3.1 in debug mode in VS.

Open
#5,566 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.