Ответ 1
В ответах есть несколько недоразумений, в основном основанных на неправде, что локальные переменные выделяются "в стеке потока". Это и ложно, и не имеет значения.
Это false, потому что локальная переменная может быть выделена в некотором временном пуле или в пуле длительного хранения; даже если он распределен во временном пуле, который не обязательно должен быть стекю; это может быть регистр. Это не имеет значения, потому что кто заботится о том, на каком пуле хранится хранилище?
Соответствующий факт состоит в том, что локальная переменная верхнего уровня назначается для активации каждого метода. В общем случае локальная переменная в блоке выделяется один раз на каждый введенный блок; локальная переменная, объявленная в теле цикла, например, выделяется каждый раз, когда цикл проходит.
Итак, рассмотрим ваш вопрос:
Этот метод можно вызывать одновременно из нескольких потоков. Если один поток застрял в DoStuffThatMightTakeAWhile, а затем второй поток вызывает DoSomething с другим arg, это изменит значение someVar для всех потоков?
Нет. Для каждой активации DoSomething существует новый "someVar".
будет ли существовать какой-нибудь символ для каждого потока?
Для каждой активации будет существовать один "someVar". Если поток выполняет ровно одну активацию, тогда будет ровно один someVar на поток; если поток выполняет миллион активаций, тогда их будет миллион.
Тем не менее, ответ Джона Ханны также верен: если вы делаете делегат, который читает и записывает локальную переменную, и вы передаете этот делегат нескольким потокам, то все активации делегата имеют одну и ту же локальную переменную. Для вас нет волшебной нити безопасности; если вы хотите это сделать, вы отвечаете за обеспечение безопасности потоков.