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

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

Сообщение Anonymous »

Я новичок в мире параллельных вычислений и провел много исследований по поводу гонок за данными и способов их избежать. Концепция мне вполне ясна, но у меня возник бы вопрос по поводу использования std::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 vector;
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);
vector.emplace_back(vec_loc);
}

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

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

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

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

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

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

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

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