以下是我的情况的简化版本:
void AppendToVector(std::vector<int>* my_vector) {
for (int i = 0; i < 100; i++) {
my_vector->push_back(i);
}
}
void CreateVectors(const int num_threads) {
std::vector<std::vector<int>* > my_vector_of_pointers(10);
ThreadPool pool(num_threads);
for (for int i = 0; i < 10; i++) {
my_vector_of_pointers[i] = new std::vector<int>();
pool.AddTask(AppendToVector,
&my_vector_of_pointers[i]);
}
}
我的问题是,在使用多个线程运行时,是否需要在AppendToVector中放置一个互斥锁?我的直觉告诉我,我没有必要,因为两个线程不可能访问相同的数据,但我并不完全自信。
答案 0 :(得分:1)
每个线程都附加了不同的std::vector
(在AppendToVector
函数内),所以不需要锁定你的情况。如果您以多个线程访问相同向量的方式更改代码,则需要锁定。不要感到困惑,因为你传递给std::vectors
的{{1}}是主AppendToVector
的自我元素,重要的是这里的线程操作完全不同(不共享)记忆