static int Main(string[] args)
        {
            // Check number of args
            if(args.Length != 2)
            {
                Console.WriteLine("USAGE:  CompareExchangeDouble " +
                    "/loops:<int> /addVal:<double>");
                return -1;
            }

            // Get the args
            int loops=100;
            double valueToAdd = 1E+100;
        
            for(int i=0;i<args.Length;i++)
            {
                if(args[i].ToLower().StartsWith("/loops:"))
                {
                    loops = Convert.ToInt32(args[i].Substring(7));
                    continue;
                }

                if(args[i].ToLower().StartsWith("/addval:"))
                {
					CultureInfo myCultureInfo = new CultureInfo("en-US");
					valueToAdd = Double.Parse(args[i].Substring(8), myCultureInfo);
                    continue;
                }
            }

            int rValue = 0;
            Thread[] threads = new Thread[100];
            ThreadSafe tsi = new ThreadSafe(loops,valueToAdd);
            for (int i = 0; i < threads.Length; i++)
            {
                threads[i] = new Thread(new ThreadStart(tsi.ThreadWorker));
                threads[i].Start();
            }
            
            tsi.Signal();

            for(int i=0;i<threads.Length;i++)
                threads[i].Join();
            double expected = 0.0D;
            for(int i=0;i<threads.Length*loops;i++)
                expected = (double)(expected + valueToAdd);
            if(tsi.Total == expected)
                rValue = 100;
            Console.WriteLine("Expected: "+expected);
            Console.WriteLine("Actual  : "+tsi.Total);
            Console.WriteLine("Test {0}", rValue == 100 ? "Passed" : "Failed");
            return rValue;
        }
        static int Main(string[] args)
        {
            // Check number of args
            if (args.Length != 2)
            {
                Console.WriteLine("USAGE:  CompareExchangeDouble " +
                                  "/loops:<int> /addVal:<double>");
                return(-1);
            }

            // Get the args
            int    loops      = 100;
            double valueToAdd = 1E+100;

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i].ToLower().StartsWith("/loops:"))
                {
                    loops = Convert.ToInt32(args[i].Substring(7));
                    continue;
                }

                if (args[i].ToLower().StartsWith("/addval:"))
                {
                    CultureInfo myCultureInfo = new CultureInfo("en-US");
                    valueToAdd = Double.Parse(args[i].Substring(8), myCultureInfo);
                    continue;
                }
            }

            int rValue = 0;

            Thread[]   threads = new Thread[100];
            ThreadSafe tsi     = new ThreadSafe(loops, valueToAdd);

            for (int i = 0; i < threads.Length; i++)
            {
                threads[i] = new Thread(new ThreadStart(tsi.ThreadWorker));
                threads[i].Start();
            }

            tsi.Signal();

            for (int i = 0; i < threads.Length; i++)
            {
                threads[i].Join();
            }
            double expected = 0.0D;

            for (int i = 0; i < threads.Length * loops; i++)
            {
                expected = (double)(expected + valueToAdd);
            }
            if (tsi.Total == expected)
            {
                rValue = 100;
            }
            Console.WriteLine("Expected: " + expected);
            Console.WriteLine("Actual  : " + tsi.Total);
            Console.WriteLine("Test {0}", rValue == 100 ? "Passed" : "Failed");
            return(rValue);
        }