volatile
используется в следующих случаях для MSDN:
Ключевое слово volatile - это спецификатор типа, используемый для объявления того, что объект может быть изменен в программе с помощью чего-либо, например операционной системы.аппаратное обеспечение или одновременно выполняющийся поток.
Объекты, объявленные как volatile
, не используются в определенных оптимизациях, поскольку их значения могут измениться в любое время .Система всегда считывает текущее значение энергозависимого объекта в точке, в которой оно запрашивается, даже если предыдущая инструкция запрашивала значение из того же объекта.Кроме того, значение объекта записывается сразу при назначении.
Вопрос в вашем случае, как часто ваш NewEndPoint
действительно изменяется?Вы создаете соединение в потоке A, а затем выполняете некоторую работу.Пока это происходит, ничто другое не может возиться с вашей конечной точкой, так как она заблокирована мьютексом.Итак, согласно моему анализу, и из того, что я вижу в вашем коде, эта переменная не обязательно изменяется достаточно.
Я не вижу сайт вызова вашего класса, поэтому я не знаю, используете ли вы один и тот же экземпляр класса 100 раз или более, или вы создаете новые объекты.
Это тот тип анализа, который вам необходимо выполнить, когда спрашиваете, должно ли что-то быть volatile
или нет.
Кроме того, что касается безопасности ваших потоков, что происходит в следующих функциях:
client.doReconnectionStuff();
client.doReconnectionStuff2();
Используют ли они какое-либо общее состояние из вашего Worker
класса?Они разделяют и изменяют любое другое использование состояния другим потоком?Если да, вам нужно выполнить соответствующую синхронизацию.
Если нет, то все в порядке.
Потоки требуют некоторого размышления, вам нужно задать себе эти вопросы.Вам нужно посмотреть на все состояние и задаться вопросом, разделяете ли вы.Если вы имеете дело с указателями, вам нужно знать, кто владеет указателем, и делитесь ли вы им когда-либо между потоками, случайно или нет, и действовать соответствующим образом.Если вы передаете указатель на функцию, которая запускается в другом потоке, вы делитесь объектом, на который указывает указатель.Если затем вы измените то, на что он указывает, в этом новом потоке, вы поделитесь им и должны синхронизироваться.