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