可能存在的问题
数据竞争
当两个或多个线程同时读写同一个容器且至少有一个线程在写时,会导致数据竞争。这种情况下,容器的内部状态可能会被破坏,从而导致未定义行为。这些未定义的行为包括数据损坏,程序崩溃,以及无法预料的随机性错误。
数据损坏
容器的内部数据结构可能会被多个线程同时修改,从而导致数据不一致。例如,向 std::vector
中添加元素时,如果没有适当的同步,可能会导致内部数组的重新分配和指针失效。
程序崩溃
数据竞争可能导致程序崩溃。例如,容器的内部指针或迭代器被破坏,导致非法内存访问,从而引发段错误(Segmentation Fault)。
不可预测行为
由于多线程竞争条件的不可预测性,程序可能表现出随机性错误。某些情况下,错误可能不会立即显现,但在特定条件下可能会触发。
这里我们可以做个测试
#include <iostream>
#include <vector>
#include <thread>
void append_to_vector(std::vector<int>& vec) {
for (int i = 0; i < 1000; ++i) {
vec.push_back(i); // 可能会导致数据竞争
}
}
int main() {
std::vector<int> myVector;
std::thread t1(append_to_vector, std::ref(myVector));
std::thread t2(append_to_vector, std::ref(myVector));
t1.join();
t2.join();
std::cout << "Vector size: " << myVector.size() << std::endl;
return 0;
}
编译执行一下,看看会发生什么错误
可以看到这里是引发了访问冲突,其实这种行为即使是重复也会出现不一样的结果。
解决方案
1、加入互斥锁。
2、使用线程安全的容器。
3、设计程序时避免多个线程共享数据。