Уже опубликовано сомнение по поводу той же проблемы, но я думаю, что ответы начали идти в другом направлении, поэтому я попытаюсь сосредоточить свои вопросы: P
1) Необходимо заполнить огромный вектор некоторымиданные.Чтобы повысить скорость, я хочу использовать потоки для выполнения работы, поэтому 1 поток может записать первую половину вектора, а другой поток записать вторую половину.
Поскольку каждый поток получает доступ к различным позициям вектора... Нужно ли защищать этот доступ?
Другими словами, могу ли я писать одновременно в 2 разных положениях этой структуры, не защищая ее?
...
using namespace std;
...
main{
int n = 256x1024x1024;
vector<int> vec(n);
thread t1(fillFunction(std::ref(vector), 0, n/2);
thread t2(fillFunction(std::ref(vector), n/2, n);
t1.join;
t2.join;
}
fillFunction(vector<int> &vec, int first, int final){
int i;
for (i = first; i < final; i++){
vec[i] = some_data;
}
}
В случаея должен защитить доступ, должен ли я использовать lock_guard или unique_lock?
2) Это потоковое решение действительно собирается улучшить скорость?
Я имею в виду, даже если я защищаю записи,вектор достаточно велик, чтобы не помещаться в кэш.Потоки пишут в очень разных позициях, поэтому 'for' будет генерировать так много ошибок кэша.
Могут ли эти "ошибки кэша" привести к более медленному выполнению, чем без потоков?
Создание 1поток, чтобы заполнить четные числа, а другой поток нечетные числа могут уменьшить пропуски кэша?
thread t1(fillFunction(std::ref(vector), 0, n/2);
thread t2(fillFunction(std::ref(vector), 1, n);
[...]
for (i = first; i < final; i = i+2){
vec[i] = some_data;
}
Спасибо всем:)