.NET 4.x Программа в четыре потока работает медленнее, чем ожидалось - C#
Формулировка задачи:
Помогите исправить ошибки. Начал разбираться с многопоточностью, пробую создать 4-е потока но работает медленне чем в одном. Нужно выполнить сравнение обдного объекта с другими. Разбиваю список объектов сравнения на 4 группы, для каждого потока. StartChecking создает 4-е потока, запускает и ждет выполнение всех. Делю список объектов что бы не синхронизировать доступ.
public class ThreadManager
{
private Grid _grid;
private Grid _grid1;
private Grid _grid2;
private Grid _grid3;
private Grid _grid4;
private Stack<Grid> _grids;
private Stack<Grid> _grids1;
private Stack<Grid> _grids2;
private Stack<Grid> _grids3;
private Stack<Grid> _grids4;
public bool IsUnique { get; private set; }
private bool _isUnique1 = true;
private bool _isUnique2 = true;
private bool _isUnique3 = true;
private bool _isUnique4 = true;
public ThreadManager(Grid grid, IEnumerable<Grid> grids):
this()
{
_grid = grid;
_grid1 = (Grid)_grid.Clone();
_grid2 = (Grid)_grid.Clone();
_grid3 = (Grid)_grid.Clone();
_grid4 = (Grid)_grid.Clone();
_grids = new Stack<Grid>(grids);
if (_grids.Count > 3)
{
var seporator = _grids.Count / 4;
var list = new List<Grid>(grids);
var list1 = new List<Grid>();
var list2 = new List<Grid>();
var list3 = new List<Grid>();
var list4 = new List<Grid>();
list1.AddRange(list.GetRange(0, seporator));
_grids1 = new Stack<Grid>(list1);
list2.AddRange(list.GetRange(seporator, seporator));
_grids2 = new Stack<Grid>(list2);
list3.AddRange(list.GetRange(seporator * 2, seporator));
_grids3 = new Stack<Grid>(list3);
list4.AddRange(list.GetRange(seporator * 3, list.Count - (seporator*3)));
_grids4 = new Stack<Grid>(list4);
}
}
public ThreadManager()
{
_grids1 = new Stack<Grid>();
_grids2 = new Stack<Grid>();
_grids3 = new Stack<Grid>();
_grids4 = new Stack<Grid>();
IsUnique = true;
}
public void StartChecking()
{
if (_grids.Count > 3)
{
var th1 = new Thread(workFunc1);
th1.Start();
var th2 = new Thread(workFunc2);
th2.Start();
var th3 = new Thread(workFunc3);
th3.Start();
var th4 = new Thread(workFunc4);
th4.Start();
th1.Join();
th2.Join();
th3.Join();
th4.Join();
IsUnique = _isUnique1 & _isUnique2 & _isUnique3 & _isUnique4;
}
else
{
workFunc();
}
}
private void workFunc()
{
while (_grids.Any())
{
if (!_grid.Equals(_grids.Pop()))
continue;
IsUnique = false;
return;
}
}
private void workFunc1()
{
while (_grids1.Any())
{
if (!_grid1.Equals(_grids1.Pop()))
continue;
_isUnique1 = false;
return;
}
}
private void workFunc2()
{
while (_grids2.Any())
{
if (!_grid2.Equals(_grids2.Pop()))
continue;
_isUnique2 = false;
return;
}
}
private void workFunc3()
{
while (_grids3.Any())
{
if (!_grid3.Equals(_grids3.Pop()))
continue;
_isUnique3 = false;
return;
}
}
private void workFunc4()
{
while (_grids4.Any())
{
if (!_grid4.Equals(_grids4.Pop()))
continue;
_isUnique4 = false;
return;
}
}
}Решение задачи: «.NET 4.x Программа в четыре потока работает медленнее, чем ожидалось»
textual
Листинг программы
var numbers = Enumerable.Range(0, 100000000);
var flag = true;
Parallel.ForEach(numbers, (i, s) =>
{
if (i == 100499999)
{
flag = false;
s.Break();
}
});