コード例 #1
0
        private void IncreasePiValueBySpin(object arg)
        {
            var argsThread = ( ArgsThread )arg;

            for (int i = argsThread.Left; i < argsThread.Right; i++)
            {
                var x = (i + 0.5) * argsThread.Step;
                _criticalSection.Enter();
                _pi += 4.0 / (1.0 + x * x) * argsThread.Step;
                _criticalSection.Leave();
            }
        }
コード例 #2
0
        private static void CalculateWithEnter(object arg)
        {
            if (arg.GetType() != typeof(ArgsThread))
            {
                throw new Exception("Incorrect type.");
            }
            ArgsThread argsThread = (ArgsThread)arg;

            for (long i = argsThread.left; i < argsThread.right; ++i)
            {
                double x     = (i + 0.5) * argsThread.step;
                double value = 4.0 / (1 + x * x) * argsThread.step;

                criticalSection.Enter();
                pi += value;
                criticalSection.Leave();
            }
        }
コード例 #3
0
        public double Integrate()
        {
            _pi = 0;
            Action enterToCS = () => _cs.Enter();

            void leaveCS() => _cs.Leave();

            if (_csType == CSType.TryEnter)
            {
                enterToCS = () => { while (!_cs.TryEnter(_timeout))
                                    {
                                    }
                };
            }

            BeginIntegrate(_iterationNumber, enterToCS, leaveCS);

            return(_pi);
        }
コード例 #4
0
ファイル: PiGenerator.cs プロジェクト: protasov-ilja/PP
        private void CalculatePi(object args)
        {
            var data = (ArgsThread)args;

            for (var i = data.Left; i < data.Right; ++i)
            {
                var x = (i + 0.5) * data.Step;
                if (data.EnterType == EnterType.Enter)
                {
                    _criticalSection.Enter();
                }
                else
                {
                    while (!_criticalSection.TryEnter(Timeout))
                    {
                        ;
                    }
                }

                _pi += 4.0 / (1.0 + x * x) * data.Step;
                _criticalSection.Leave();
            }
        }
コード例 #5
0
        public double CalculatePi()
        {
            m_pi = 0;
            Action enter = () => m_criticalSection.Enter();

            void leave() => m_criticalSection.Leave();

            if (m_enterMethod == "TryEnter")
            {
                enter = () => {
                    while (!m_criticalSection.TryEnter(m_timeout))
                    {
                    }
                };
            }

            var workers = new List <Thread>();

            int    stepsCountPerThread = m_iterations / THREADS_COUNT;
            double step = 1.0 / m_iterations;

            for (int i = 0; i < THREADS_COUNT; i++)
            {
                var newThread = new Thread(Worker);
                newThread.Start(new ArgsThread(i * stepsCountPerThread, (i + 1) * stepsCountPerThread, step, enter, leave));

                workers.Add(newThread);
            }

            foreach (Thread worker in workers)
            {
                worker.Join();
            }

            return(m_pi);
        }