2016-07-22 2 views
0

У меня есть очень простой код, в котором несколько потоков пытаются вставить данные в станде :: карте и согласно моему пониманию это должно привело к ее аварийному завершению, потому что это гонки данныхstd :: map insert thread safe in C++ 11?

std::map<long long,long long> k1map; 
void Ktask() 
{ 
    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(random_variable, random_variable)); 
    } 
} 


int main() 
{ 
    std::srand((int)std::time(0)); // use current time as seed for random generator 
    for (int i = 0; i < 1000; ++i) 
    { 
      std::thread t(Ktask); 
      std::cout << "Thread created " << t.get_id() << std::endl; 
      t.detach(); 
    } 

    return 0; 
} 

Однако я провел это время множественного и нет сбоя приложения, и если запустить тот же код с pthread и C++ 03, это сбой, поэтому мне интересно, есть ли какие-то изменения в C++ 11, которые делают поток вставки вставки вставки безопасным?

+0

Если ваш код не является * доказуемо * потокобезопасным, то вы не должны предполагать, что это так. Вы не должны предполагать, что что-либо в отношении потоковой передачи отлично, потому что программа не сработала. –

+0

Да, я понимаю, что проблема заключается в том, что аналогичный код, который мы используем в производственной среде, сбой, и код сбой, когда внутреннее дерево карты перебалансируется, поэтому просто хочу знать, есть ли какие-либо изменения в C++ 11 для обеспечения безопасности вставки вставки карты, потому что там мы используем C++ 03 с phreads – Kapil

ответ

1

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

Существует множество причин, по которым ваш пример может не произойти. Ваши потоки могут запускаться серийным способом из-за системного планировщика или потому, что они заканчиваются очень быстро (1000 итераций не так уж много). Ваша карта будет быстро заполняться (только с 1000 узлами), и поэтому последующие вставки фактически не изменят структуру и не уменьшат вероятность сбоев. Или, возможно, реализация, которую вы используете, является потокобезопасной.

0

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

И std::map не является одним из исключений из этого правила. Реализация может предложить вам больше гарантии, или вам просто повезет.

И когда дело доходит до фиксации резьбовых ошибок, есть только один вид удачи.