Re[3]: multithreading : visibility control
От: Stanislav V. Zudin Россия  
Дата: 30.05.13 12:21
Оценка:
Здравствуйте, 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 и дальше включать вручную).
Может повезти и инициализация произойдет до переключения контекста.
Только к языку это не имеет отношения.
_____________________
С уважением,
Stanislav V. Zudin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.