public SharedSynchronizationContextImpl( SharedSynchronizationContext host, int startingCpu, int threadsCount, string name, CancellationToken token) { if (threadsCount < 0 || threadsCount > Environment.ProcessorCount) { threadsCount = Environment.ProcessorCount; } _host = host; _name = name; _hasJobEvent = new ManualResetEvent(false); _runners = new List <ThreadRunner>(); _importedThreads = new List <ThreadRunner>(); _exportedRunners = new List <IDisposable>(); _tasks = new ConcurrentQueue <LocalTask>(); // Setup threads for (var processor = startingCpu; processor < startingCpu + threadsCount; processor++) { _runners.Add(new ThreadRunner( this, processor, _hasJobEvent, _tasks, token)); } }
public static void Main() { using var contextsGroup = new SharedSynchronizationContext(); // full load // var context = new SynchronizationContext(); // load only 2 cores // using (var context = new MultiThreadSynchronizationContext(2, 2)) // full load // using (var context = new MultiThreadSynchronizationContext(0, Environment.ProcessorCount)) // CPU0 -> CPU1 -> CPU0 -> CPU1 -> CPU0 -> CPU1 ... // using (var context = new SwitchCoresSynchronizationContext(Environment.ProcessorCount)) var context = contextsGroup.GetSynchronizationContext(1, 2, "context #1"); var context2 = contextsGroup.GetSynchronizationContext(3, 2, "context #2"); { var results = new ConcurrentQueue <string>(); LoopLoop(context, results); Thread.Sleep(3000); LoopLoop(context2, results); var spin = new SpinWait(); var starvation = Stopwatch.StartNew(); do { while (results.TryDequeue(out var message)) { //Console.WriteLine(message); starvation.Restart(); } spin.SpinOnce(); } while (starvation.ElapsedMilliseconds < 300); } }