Здравствуйте, uzhas, Вы писали:
U>U>std::map<int, std::string> globalMap; // global var
U>//run in thread1
U>void t1_func()
U>{
U> globalMap[1] = "1";
U> globalMap[2] = "12";
U> globalMap[3] = "123";
U> spawnThread(&t2_func);
U>}
U>//run in thread2
U>void t2_func()
U>{
U> auto it = globalMap.find(2);
U> assert(it != globalMap.end());
U>}
U>
U>интересует какие правила регулируют то, что все модификации, произведенные в первом потоке будут видны во втором потоке в момент вызова find. вернет ли find globalMap.end() при каких-то условиях и следует ли как-то явно подсказывать компилятору о необходимости сбросить все модификации перед чтением
В этом примере все будет работать как и положено.
Точки следования заданы явно и непротиворечиво, порядок вызова функций будет такой, как в исходном коде.
До вызова spawnThread рабочего потока не существует.
Вот если вызвать spawnThread до инициализации мапки:
void t1_func()
{
spawnThread(&t2_func);
globalMap[1] = "1";
globalMap[2] = "12";
globalMap[3] = "123";
}
то определить момент, когда запустится рабочий поток и полезет в мапку невозможно (разве что создавать поток suspended и дальше включать вручную).
Может повезти и инициализация произойдет до переключения контекста.
Только к языку это не имеет отношения.