The Computer Language
Benchmarks Game

thread-ring C# .NET Core program

source code

/* The Computer Language Benchmarks Game
   http://benchmarksgame.alioth.debian.org/
 * contributed by Isaac Gouy
 */

using System;
using System.Threading;


internal class NamedThread
{
   private int name;
   private AutoResetEvent signal = new AutoResetEvent(false);
   private int token = 0;

   internal NamedThread(int name) {
      this.name = name;
   }

   internal void Run() {
      while (TokenNotDone()) 
         NextThread().TakeToken(token-1);

      if (token == 0) Console.WriteLine(name);
      NextThread().TakeToken(-1);
   }

   private bool TokenNotDone() {
      signal.WaitOne();
      return token > 0;
   }

   internal NamedThread NextThread() {
      return ThreadRing.threadRing[ name % ThreadRing.numberOfThreads ];
   }

   internal void TakeToken(int x) {
      token = x;
      signal.Set();
   }
}


public class ThreadRing
{
   internal const int numberOfThreads = 503;
   internal static NamedThread[] threadRing = new NamedThread[503];

   public static void Main(string[] args) {
      for (int i = 0; i < numberOfThreads; i++){ 
         threadRing[i] = new NamedThread(i+1);
      }

      foreach (NamedThread t in threadRing) 
         new Thread(new ThreadStart(t.Run)).Start(); 

      threadRing[0].TakeToken( int.Parse(args[0]) );
   }
}
    

notes, command-line, and program output

NOTES:
64-bit Ubuntu quad core
2.0.2 a04b4bf512
"System.GC.Server": true


Fri, 27 Oct 2017 01:28:23 GMT

MAKE:
cp threadring.csharpcore Program.cs
cp Include/csharpcore/tmp.csproj .
cp Include/csharpcore/runtimeconfig.template.json .
mkdir obj
cp Include/csharpcore/tmp.csproj.nuget.g.props ./obj
cp Include/csharpcore/tmp.csproj.nuget.g.targets ./obj
/usr/bin/dotnet build -c Release
Microsoft (R) Build Engine version 15.4.8.50001 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  tmp -> /home/dunham/benchmarksgame_quadcore/threadring/tmp/bin/Release/netcoreapp2.0/tmp.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:03.43

6.00s to complete and log all make actions

COMMAND LINE:
/usr/bin/dotnet ./bin/Release/netcoreapp2.0/tmp.dll 50000000

PROGRAM OUTPUT:
292