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(); } }
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(); } }
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); }
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(); } }
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); }