view MonoPlay/Program.cs @ 136:e9e7940c7d98 v2

shared locks + tests
author cin
date Mon, 16 Feb 2015 01:14:09 +0300
parents f803565868a4
children f75cfa58e3d4
line wrap: on
line source

using System;
using Implab.Diagnostics;
using Implab.Parallels;
using Implab;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Threading;

namespace MonoPlay {
    class MainClass {
        public static void Main(string[] args) {
            if (args == null)
                throw new ArgumentNullException("args");

            var t1 = Environment.TickCount;

            const int reads = 100000;
            const int writes = 1000;
            const int readThreads = 8;
            const int writeThreads = 0;

            var l = new SharedLock();
            var st = new HashSet<int>();

            Action reader1 = () => {
                for (int i =0; i < reads; i++) {
                    try {
                        l.LockShared();
                        st.Contains(i % 1000);
                        Thread.Sleep(0);
                    } finally {
                        l.Release();
                    }
                }
            };

            Action reader2 = () => {
                for(var i = 0; i < reads; i++)
                    lock(st) {
                        st.Contains(i % 1000);
                        Thread.Sleep(0);
                    }
            };

            Action writer1 = () => {
                var rnd = new Random(Environment.TickCount);
                for (int i = 0; i < writes; i++) {
                    try {
                        l.LockExclusive();
                        st.Add(rnd.Next(1000));
                        //Thread.Sleep(1);
                    } finally {
                        l.Release();
                    }
                }
            };

            Action writer2 = () => {
                var rnd = new Random(Environment.TickCount);
                for (int i = 0; i < writes; i++) {
                    lock (st) {
                        st.Add(rnd.Next(1000));
                        //Thread.Sleep(1);
                    }
                }
            };



            var readers = new IPromise[readThreads];
            for (int i = 0; i < readThreads; i++)
                readers[i] = AsyncPool.RunThread(reader1);

            var writers = new IPromise[writeThreads];
            for (int i = 0; i < writeThreads; i++)
                writers[i] = AsyncPool.RunThread(writer1);


            new [] {
                readers.Bundle().On(() => Console.WriteLine("readers complete in {0} ms", Environment.TickCount - t1)),
                writers.Bundle().On(() => Console.WriteLine("writers complete in {0} ms", Environment.TickCount - t1))
            }.Bundle().Join();



            var t2 = Environment.TickCount;
            Console.WriteLine("done: {0} ms, {1:.00} Mb, {2} GC", t2 - t1, GC.GetTotalMemory(false) / (1024*1024), GC.CollectionCount(0) );

        }


    }
}