Как мне защитить доступ к общей переменной? - PullRequest
0 голосов
/ 25 марта 2011

Уже опубликовано сомнение по поводу той же проблемы, но я думаю, что ответы начали идти в другом направлении, поэтому я попытаюсь сосредоточить свои вопросы: 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;
}

Спасибо всем:)

1 Ответ

1 голос
/ 26 марта 2011

1) Нет, вам не нужно защищать вектор, если вы гарантированно пишете по разным адресам.

2) Вам действительно нужно просто протестировать эти вещи на своей машине.Попробуйте единый поток, чередующийся доступ, разделенный доступ и просто рассчитайте время.

...