Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.
Например:
string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)
if (testString.Length == 0) // Throws a nullreferenceexception
{
//Do something
}
Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.
По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит
Дополнительная информация находится в C # NullReferenceException и Null Parameter .
Доступ к перечислению (чтение или запись) должен быть защищен.
Другое дело: если конфликт потоков меньше, а потоки принадлежат одному и тому же процессу, то критический раздел будет лучше, чем мьютекс.
Вообще говоря, вы этого не делаете, если ваша переменная объявлена с помощью «volatile». И ТОЛЬКО, если это единственная переменная - иначе вы должны быть очень осторожны в возможных гонках.
У вас есть два потока, они обмениваются информацией, да вам нужен мьютекс, и вам, вероятно, также потребуется условное ожидание.
В вашем примере (compare state_ == ESTABLISHED) указывает, что поток # 2 ждет для потока # 1, чтобы инициировать соединение / состояние. Без мьютекса или условных выражений / событий поток # 2 должен постоянно отслеживать состояние.
Потоки используются для повышения производительности (или улучшения реагирования), опрос обычно приводит к снижению производительности, либо потребляя много CPU или путем введения латентного за счет интервала опроса.
на самом деле, нет причин блокировать доступ к объекту для чтения. вы только хотите заблокировать его во время записи. это именно то, что блокирует читатель-писатель. он не блокирует объект, если нет операций записи. он повышает производительность и предотвращает взаимоблокировки. см. следующие ссылки для более подробных объяснений:
Это зависит.
Язык C ++ ничего не говорит о потоках или атомарности.
Но в большинство современных процессоров, чтение целого числа является атомной операцией , что означает, что вы всегда будете читать постоянное значение, даже без мьютекса.
Однако, без мьютекса или какой-либо другой формы синхронизации, компилятор и процессор могут свободно изменять порядок чтения и записи, поэтому все, что связано с доступом к нескольким переменным, по-прежнему небезопасно в общем случае.
Предполагая, что поток писателя обновляет некоторые данные, а затем устанавливает флаг целого, чтобы информировать другие потоки о том, что данные доступны, это может переупорядочиваться, поэтому флаг перед обновляет данные. Если вы не используете мьютекс или другую форму барьера памяти.
Итак, если вы хотите правильного поведения, вам не нужен мьютекс как таковой, и нет проблем, если другой поток записывает эту переменную, перечитав его. Это будет атомный, если вы не работаете с очень необычным процессором. Но вам нужен какой-то барьер памяти, чтобы предотвратить переупорядочение в компиляторе или процессоре.
Да. Если thread a читает переменную, а поток b записывает ее, вы можете прочитать неопределенное значение. Операция чтения и записи не является атомарной, особенно в многопроцессорной системе.