Короткий ответ: Да, каждый поток может иметь свою собственную копию переменной i
.
Длинный ответ:
Все потоки совместно используют один и тот же адресное пространство и операционная система не обеспечивает никакой защиты, чтобы предотвратить один поток от доступа к памяти, используемой другим. Однако память может быть разделена так, что к ней будет доступен только один поток, а не общий доступ для всех потоков.
По умолчанию каждый поток получает свой собственный стек. Поэтому, если вы выделяете переменную в стеке, к ней обычно будет доступен только один поток. Обратите внимание, что можно передать указатель на переменную стека из одного потока в другой, но это не рекомендуется и может быть источником тех проблем, которые вы видите.
Другим способом получения потока собственной копией переменной является использование локального хранилища потоков. Это позволяет каждому потоку иметь собственную копию глобальной переменной.
Таким образом, хотя потоки разделяют адресное пространство, они могут работать с частными данными. Но вам нужно быть осторожным с тем, как вы делитесь данными между потоками и избегаете гонок данных.
не используют глобальные или статические переменные и не пропускают указатели между потоками, и у вас не должно быть слишком много проблем. Единственное, что нужно помнить, - это функции библиотеки, которые используют глобальные переменные или статические varaibles ..... – goji
Кроме того, ваш пример на самом деле не показывает, где находится общая память, где объявляются эти переменные? – goji
вы имеете в виду, как 'fork()'? ... вы все равно можете использовать общую память, семафоры, ... – technosaurus