using System; using System.Threading; class LockPerf { static object [] work_items = new object [] { new object (), new object (), new object (), new object (), new object () }; static void Main (string [] args) { int lock_threads = int.Parse (args [0]); int other_threads = int.Parse (args [1]); for (int i = 0; i < other_threads; i ++) { Thread t = new Thread (new ThreadStart (OtherWorkThread)); t.IsBackground = false; t.Start (); } for (int i = 0; i < lock_threads; i ++) { Thread t = new Thread (new ThreadStart (LockThread)); t.IsBackground = false; t.Start (); } } static void Work (object o) { const double dx = .01; double area = 0; lock (o) { for (double x_i = 0; x_i < 1; x_i += dx) area += Math.Sin (x_i) * dx; if (area == 0) Console.WriteLine ("dummy test"); } } static void LockThread () { for (int i = 0; i < 10000; i ++) { foreach (object o in work_items) Work (o); } } static void OtherWorkThread () { for (int i = 0; i < 100; i ++) { const double dx = .0001; double area = 0; for (double x_i = 0; x_i < 1; x_i += dx) area += Math.Sin (x_i) * dx; if (area == 0) Console.WriteLine ("dummy test"); } } }