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));
                }
            }
コード例 #2
0
        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);
            }
        }