Advertisement
ebak32

BuildQueue test

Oct 13th, 2016
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.97 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Threading;
  5.  
  6. namespace BuildQueueTest {
  7.  
  8.     class Worker {
  9.  
  10.         protected QueueTask qTask = null;
  11.         protected Boolean stopRequest = false;
  12.         protected BuildQueue queue;
  13.         protected Thread thr;
  14.         private readonly object lockObj = new object();
  15.  
  16.         public Worker(BuildQueue queue, int id) {
  17.             thr = new Thread(new ThreadStart(run));
  18.             this.queue = queue;
  19.             thr.Name = "Wrk" + id;
  20.         }
  21.  
  22.         public void Start() {
  23.             thr.Start ();
  24.         }
  25.  
  26.         public void Join() {
  27.             thr.Join ();
  28.         }
  29.  
  30.         public void run() {
  31.             while (true) {
  32.                 lock (lockObj) {
  33.                     queue.regWaiter (this);
  34.                     if (stopRequest)
  35.                         break;
  36.                     if (qTask == null) {
  37.                         Monitor.Wait (lockObj);
  38.                         if (stopRequest)
  39.                             break;
  40.                     }
  41.                 }
  42.                 QueueTask cqTask = qTask;
  43.                 qTask = null;
  44.                 cqTask.execute ();
  45.                 queue.release (qTask);
  46.             }
  47.         }
  48.  
  49.         public void setQueueTask(QueueTask qTask) {
  50.             lock (lockObj) {
  51.                 this.qTask = qTask;
  52.                 Monitor.Pulse (lockObj);    // notify
  53.             }
  54.         }
  55.  
  56.         public void stop() {
  57.             lock (lockObj) {
  58.                 stopRequest = true;
  59.                 Monitor.Pulse (lockObj);
  60.             }
  61.         }
  62.  
  63.     }
  64.  
  65.     class QueueTask {
  66.  
  67.         public void execute() {
  68.             Stopwatch sw = new Stopwatch ();
  69.             sw.Start ();
  70.             while (sw.ElapsedMilliseconds < 3000) {
  71.                 // dummy CPU burning loop
  72.             };
  73.             sw.Stop ();
  74.         }
  75.    
  76.     }
  77.  
  78.     class BuildQueue {
  79.  
  80.         protected int numWorkers;
  81.         protected List<Worker> workers = new List<Worker>(), waitingWorkers = new List<Worker>();
  82.         protected Boolean finished = false;
  83.         protected int rc = 0;
  84.         protected List<QueueTask> sortedList = new List<QueueTask> ();  // TODO: use SortedList
  85.         protected readonly object lockObj = new object();
  86.  
  87.         public BuildQueue(int numWorkers) {
  88.             this.numWorkers = numWorkers;
  89.             waitingWorkers = new List<Worker> ();
  90.         }
  91.  
  92.         private void feedWorker(QueueTask qTask) {
  93.             Worker worker = waitingWorkers[0];
  94.             waitingWorkers.RemoveAt(0);
  95.             // Console.WriteLine ("feed: Waiting workers=" + waitingWorkers.Count);
  96.             worker.setQueueTask(qTask);
  97.         }
  98.  
  99.         private void stopWorkers() {
  100.             Console.WriteLine ("stopWorkers");
  101.             foreach(Worker worker in waitingWorkers) {
  102.                 worker.stop();
  103.             }
  104.         }
  105.  
  106.         protected void feedWorkers() {
  107.             if (finished) {
  108.                 stopWorkers ();
  109.                 return;
  110.             }
  111.             while (waitingWorkers.Count > 0) {
  112.                 if (sortedList.Count > 0) {
  113.                     QueueTask qTask = sortedList [0];
  114.                     sortedList.RemoveAt (0);
  115.                     feedWorker (qTask);
  116.                 } else {
  117.                     // Console.WriteLine ("waitingWorkers.Count=" + waitingWorkers.Count);
  118.                     if (waitingWorkers.Count == numWorkers) {
  119.                         finished = true;
  120.                         stopWorkers ();
  121.                     }
  122.                     return;
  123.                 }
  124.             }
  125.         }
  126.  
  127.         public void add(QueueTask qTask) {
  128.             lock (lockObj)
  129.                 sortedList.Add (qTask);
  130.         }
  131.  
  132.         public void regWaiter(Worker worker) {
  133.             lock (lockObj) {
  134.                 waitingWorkers.Add (worker);
  135.                 // Console.WriteLine ("reg: Waiting workers=" + waitingWorkers.Count);
  136.                 feedWorkers ();
  137.             }
  138.         }
  139.  
  140.         public void release(QueueTask qTask) {
  141.             lock (lockObj) {
  142.                 // nothing to do in this case
  143.             }
  144.         }
  145.  
  146.         public void start() {
  147.             if (sortedList.Count == 0 || finished) {
  148.                 Console.WriteLine ("Nothing to do.");
  149.                 finished = true;
  150.                 return;
  151.             }
  152.             for (int i = 0; i < numWorkers; i++) {
  153.                 Worker w = new Worker (this, i);
  154.                 workers.Add (w);
  155.                 w.Start ();
  156.             }
  157.             foreach (Worker w in workers) {
  158.                 w.Join ();
  159.             }
  160.             Console.WriteLine ("Finished!");
  161.         }
  162.  
  163.         public void stop(int rc) {
  164.             lock (lockObj) {
  165.                 this.rc = rc;
  166.                 finished = true;
  167.             }
  168.         }
  169.        
  170.     }
  171.  
  172.     class MainClass {
  173.         public static void Main (string[] args) {
  174.             Console.WriteLine ("Hello World!");
  175.             Console.WriteLine("Number Of Logical Processors: {0}", Environment.ProcessorCount);
  176.             BuildQueue queue = new BuildQueue (numWorkers: Environment.ProcessorCount);
  177.             for (int i = 0; i < 5000; i++) {
  178.                 queue.add (new QueueTask ());
  179.             }
  180.             queue.start ();
  181.         }
  182.     }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement