Продолжаю знакомство с c++. Пришла пора улучшить программу добавлением многопоточности.
Проштудировал "C++ Programming Language" by Stroustrup.
Вынес следующие тезисы:
1. Локи бьют по перфомансу программы. Необходимо снизить их колличество, а лучше избавиться(существуют варианты для экспертов, но это мимо кассы)
2. Передавать указатель на объект в тред - плохая практика. Лучше использовать future, promise, async() чтобы получить то, что тред должен вернуть.
3. Существует некое количество тредов, котороедаст максимальный прирост к производительности. Этот показатель зависит от железа.
Сложности испытываю с тем, как следуя этим нехитрым правилам внедрить многопоточность в свою программу:
Исходные данные хранятся в 2д векторе:
Код: Выделить всё
=A2*2 =8+2
=A1/4 =B1
Так же существует второй 2д вектор такого же размера, где хранятся умные указатели на объекты типа Cell.
У класса Cell:
Код: Выделить всё
string input; //Это заполняется конструктором и равняется значению в первом векторе на такой же позиции элемента(x,y)
string output;//Это вычисляется методом eval
void eval();//Производит вычисления из input и заносит его в output. при этом иногда читаются доп значения из первого вектора(если ссылка, например)
Сейчас я циклом прохожу по второму вектору и поочередно дергаю метод eval() у каждого объекта по указателю.
Хотелось бы запускать eval() в разных потоках, но чтобы их количество(потоков) было оптимальным.
На сколько я понял, тут необходимо использовать async(), т.к. он сам управляет количеством потоков и он умеет возвращать результат работы потока.
Проблема лишь в том, как это сработает при общем доступе ко второму вектору?
Я думаю, что не должно быть никаких data races т.к. мы ничего не читаем со второго вектора(окромя текущего значения input), в основном только пишем и только 1 поток будет писать в одну ячейку. С другой же стороны, вектор не тред сейф, если мы пишем в него в несколько потоков.
Подскажите, пожалуйста, как лучше поступить в такой ситуации.
Спасибо заранее.