我知道映射在两个线程中的读写线程不安全。但是可以插入多个线程吗?
void writeMap()
{
for (int i = 0; i < 1000; i++)
{
long long random_variable = (std::rand()) % 1000;
std::cout << "Thread ID -> " << std::this_thread::get_id() << " with looping index " << i << std::endl;
k1map.insert(std::make_pair(i, new p(i)));
}
}
int main()
{
std::srand((int)std::time(0));
for (int i = 0; i < 1000; ++i)
{
long long random_variable = (std::rand()) % 1000;
std::thread t(writeMap);
std::cout << "Thread created " << t.get_id() << std::endl;
t.detach();
}
return 0;
}
无论我尝试多少次,此类代码都能正常运行。
否,std::map::insert
是不是线程安全的。
大多数标准库类型只有在单独的线程中使用单独的对象实例时才是线程安全的。看一看容器docs的线程安全部分。