Итак, у меня есть этот вектор векторов (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();
}
}
Изменить: основное предположение здесь таково. что каждый поток считывает содержимое элемента l_global_vector (функция, выполняемая каждым потоком, принимает указатель на такой элемент в качестве входного параметра), выполняет некоторую обработку, локально создает новый вектор (other_vec), а затем меняет исходный вектор в элементе l_global_vector имеет указатель на новый локальный векторother_vec. Насколько я знаю, а также просматриваю комментарии, это потокобезопасно, но проблема может заключаться в ложном совместном использовании, когда многие потоки выполняют замену одновременно (или записывают что-то в элемент l-global_vector, который есть у каждого из них). указатель на), и это может повлиять на производительность. Я думаю, что часто бывает вектор данных (представленный l_global_vector в опубликованном мной примере кода), который должен обрабатываться многими потоками (поскольку обработка каждого элемента требует времени), а затем результат обработки должен быть сохранен. в том же векторе или в новом этот вопрос смотрит на эту проблему.
Подробнее здесь: https://stackoverflow.com/questions/786 ... or-items-w