Является ли std :: map insert потокобезопасным? - PullRequest
2 голосов
/ 09 мая 2020

Я знаю, что класс std::map небезопасен для чтения и записи в двух потоках. Но можно ли вставлять в несколько потоков?

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;
}

Как будто такой код работает нормально, сколько бы раз я ни пытался.

Ответы [ 3 ]

0 голосов
/ 09 мая 2020
Программа

сложна , в некоторой степени , как магия (LOL). Результаты выполнения кода различаются в разных IDE. Раньше использовал VS2013, всегда правильно. Но на vs19 и linux результат одного и того же кода неверен. Может быть, на vs2013 реализация MAP будет особенной.

0 голосов
/ 09 мая 2020

Как упоминалось в @NutCracker, std::map::insert не является потокобезопасным.

Но, если опубликованный код работает нормально, я думаю, причина в том, что карта очень быстро заполняется одним потоком, и в результате другие потоки больше не изменяют карту.

0 голосов
/ 09 мая 2020

Нет, std::map::insert является не потокобезопасным.

Большинство стандартных библиотечных типов являются потокобезопасными, только если вы используете отдельные экземпляры объектов в отдельных потоках. Взгляните на часть безопасности потоков контейнера docs .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...