Потокобезопасность с помощью std::vector (доступ и изменение различных векторных элементов с помощью разных потоков)C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Потокобезопасность с помощью std::vector (доступ и изменение различных векторных элементов с помощью разных потоков)

Сообщение Anonymous »

Я новичок в мире параллельных вычислений и провожу множество исследований по гонкам за данными и по тому, как их избежать. Концепция мне вполне ясна, но у меня возник бы вопрос по поводу использования std::vector и модификации их элементов разными потоками.
Итак, у меня есть этот вектор векторов (l_global_vector) и передать в поток указатель на каждый элемент такого вектора; каждый поток выполняет какие-то действия и в конце заменяет содержимое нового вектора исходным. Каждый поток может работать только с одним элементом вектора, и размер вектора (l_global_vector) не изменяется (без возврата, выталкивания и т. д.). Я думаю, что это потокобезопасно (также рассматриваю другие вопросы по SO), но, поскольку оно включает в себя вектор векторов, я хотел бы спросить ваше мнение, чтобы понять, может ли быть какой-либо недостаток.
Итак, окончательный вопрос: является ли следующий код потокобезопасным??

Код: Выделить всё

#include 
#include 
#include 

void func(std::vector* vec_ptr)
{
std::vector other_vec;
other_vec.emplace_back(1);
other_vec.emplace_back(20);

vec_ptr->swap(other_vec);
}

int main()
{
std::vector l_global_vector;
l_global_vector.reserve(6);
for (int i = 0; i < 6; i++)
{
std::vector vec_loc;
vec_loc.emplace_back(1 + i);
vec_loc.emplace_back(2 + i);
vec_loc.emplace_back(3 + i);
l_global_vector.emplace_back(vec_loc);
}

std::vector threads;
for (int i = 0; i < 6; i++)
{
threads.push_back(std::thread(func, &l_global_vector[i]));
}
for (auto thread_iter = threads.begin(); thread_iter != threads.end(); thread_iter++)
{
thread_iter->join();
}
}
Код работает нормально, но хотелось бы углубиться и убедиться, что написанное мной правильно и нет недостатков (например, я читал о проблемах с std::vector из бул). Обратите внимание, что может быть также интересно заполнить вектор не int, а пользовательскими классами (которые могут быть большими).
Изменить: основное предположение здесь таково. что каждый поток считывает содержимое элемента l_global_vector (функция, выполняемая каждым потоком, принимает указатель на такой элемент в качестве входного параметра), выполняет некоторую обработку, локально создает новый вектор (other_vec), а затем меняет исходный вектор в элементе l_global_vector имеет указатель на новый локальный векторother_vec. Насколько я знаю, а также просматриваю комментарии, это потокобезопасно, но проблема может заключаться в ложном совместном использовании, когда многие потоки выполняют замену одновременно (или записывают что-то в элемент l-global_vector, который есть у каждого из них). указатель на), и это может повлиять на производительность. Я думаю, что часто бывает вектор данных (представленный l_global_vector в опубликованном мной примере кода), который должен обрабатываться многими потоками (поскольку обработка каждого элемента требует времени), а затем результат обработки должен быть сохранен. в том же векторе или в новом этот вопрос смотрит на эту проблему.

Подробнее здесь: https://stackoverflow.com/questions/786 ... or-items-w
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»