Описание состояния гонки и взаимоблокировки

Переводы статьи Переводы статьи
Код статьи: 317723 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Visual Basic .NET или Visual Basic 2005 предоставляет возможность использования потоков в приложениях Visual Basic в первый раз. Потоки представляют отладки проблемы, такие как гонки и взаимоблокировки. В данной статье рассматриваются эти две проблемы.

Дополнительная информация

Гонки

Состояние гонки возникает, когда два потока доступа к общей переменной в то же время. Первый поток считывает переменную, а второй поток считывает значение из переменной. Первый поток и второй поток выполнять свои операции по значению и они симуляторы, чтобы увидеть, какой поток может записать значение последнего к общей переменной. Значение поток, который записывает его значение последнего сохраняется, так как поток записи по значению, написал предыдущий поток.

Сведения и пример

Каждому потоку выделяется предопределенный период времени для выполнения на процессоре. По истечении времени, выделенного для потока контекст потока сохраняется до своей следующей очереди процессора и процессора начинается выполнение следующего потока.

Как одна линия может вызвать состояние гонки Просмотрите приведенный ниже, чтобы увидеть, как происходит состояние гонки. Существует два потока, и оба обновления общую переменную с именем Общее (который представляется в виде dword ptr ds: [031B49DCh] в коде сборки).

Код Visual Basic:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
Код сборки (с номера строк) из компиляции в приведенном выше коде Visual Basic:
 'Thread 1
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   add         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        7611097F 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
 'Thread 2
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   sub         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        76110BE7 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
Анализируя код сборки, можно увидеть, сколько операций процессор работает на более низком уровне, чтобы выполнить вычисление простого сложения. Поток может иметь возможность выполнить все или часть кода сборки во время его времени процессора. Теперь рассмотрим, как состояние гонки возникает из этого кода.

Всего — 100, val1 — 50, а val2 — 15. Поток 1 получает возможность выполнения, но только выполняет шаги 1-3. Это означает, что поток 1 чтения переменной и выполнить добавление. Поток 1 теперь просто ожидает записывают его новое значение 150. После остановки потока 1 поток 2 получает полностью выполнить. Это означает, что записи значение, что он рассчитанную (85) к общей переменной. Наконец поток 1 получает управление и завершает выполнение. Считывает значение (150). Таким образом по окончании поток 1 значение всего теперь — 150 вместо 85.

Можно увидеть, как это может быть важной проблемой. Если бы это был банковской программы, клиент бы деньги в свою учетную запись, которая не должна присутствовать.

Эта ошибка является случайным, поскольку поток 1 для завершения выполнения перед его время на процессор истекает, а затем поток 2 можно начать выполнение. Если эти события происходят, проблема не возникает. Выполнение потока является недетерминированным, поэтому вы не можете контролировать время и порядок выполнения. Также Обратите внимание, что потоки может выполняться по-разному в среде выполнения и в режиме отладки. Кроме того можно увидеть, что если выполнение каждого потока в серии, ошибка не происходит. Случайность это делает эти ошибки гораздо труднее отслеживать и отладки.

Для предотвращения возникновения конкуренции, можно заблокировать общих переменных, чтобы только один поток одновременно имеет доступ к общей переменной. Это только в случае необходимости, так как если переменная заблокирован в поток 1 и поток 2 также требуется переменная, поток 2 выполнение останавливается, когда поток 2 ожидает поток 1 для освобождения переменной. (Дополнительные сведения см. в «SyncLock», в разделе «Ссылки» данной статьи.)

Симптомы

Наиболее характерным признаком гонки является непредсказуемым значения переменных, которые являются общими между несколькими потоками. Это является следствием непредсказуемые результаты, в котором потоки для выполнения заказа. Иногда один поток wins и через некоторое время другой поток wins. В других случаях выполнение работает правильно. Кроме того Если каждый поток выполняется отдельно, правильное поведение значение переменной.

Взаимоблокировок

Взаимоблокировка возникает, когда двух потоков каждого блокировки отдельной переменной в то же время и затем попытаться заблокировать переменную, который уже заблокирован другим потоком. В результате каждый поток выполнение прекращается и ожидает, пока другой поток не освободит переменной. Так как каждый поток удерживает переменную, которая хочет другого потока, ничего не происходит, и потоки останется заблокированной.

Сведения и пример

Следующий код состоит из двух объектов, LeftVal и RightVal.
'Thread 1
SyncLock LeftVal
 SyncLock RightVal
  'Perform operations on LeftVal and RightVal that require read and write.
 End SyncLock
End SyncLock
				
'Thread 2
SyncLock RightVal
 SyncLock LeftVal
  'Perform operations on RightVal and LeftVal that require read and write.
 End SyncLock
End SyncLock
				
Взаимоблокировка возникает, когда поток 1 разрешается заблокировать LeftVal. Процессор останавливает выполнение потока 1 и запускает поток 2. Поток 2 блокировки RightVal, а затем пытается заблокировать LeftVal. Поскольку LeftVal заблокирован, поток 2 останавливается и ждет LeftVal к освобождению. Так как поток 2 остановлена, поток 1 может продолжить выполнение. Поток 1 пытается заблокировать RightVal, но не может, поскольку заблокирован поток 2. В результате поток 1 начинает ожидать, пока станет доступным RightVal. Каждый поток ожидает поток, так как каждый поток заблокировал переменную, которая ожидает другого потока, и ни один поток не снятие блокировки, он использовал переменную.

Не всегда происходит взаимоблокировка. Если поток 1 выполняет оба блокировки перед его закрытием процессора, поток 1 можно выполнять свои операции и затем разблокировать общей переменной. После поток 1 разблокирует переменной, поток 2 можно продолжить его выполнение, как ожидалось.

Эта ошибка кажется очевидным при этих фрагментов кода располагаются рядом друг с другом, но на практике, код может появиться в отдельных модулях или области кода. Эту ошибку сложно отслеживать, поскольку из этого же кода может возникнуть правильное выполнение и неправильного выполнения.

Симптомы

Признаком взаимоблокировки является то, что программы или группы потоков перестает отвечать на запросы. Это также называется зависание. По крайней мере два потоки являются ожидания каждой переменной, блокировки другим потоком. Потоки не продолжить, так как ни один поток не освободит его переменной, пока достигнет другой переменной. Можно разорвать всей программы, если программа находится в состоянии ожидания на одно или оба из этих потоков, чтобы завершить выполнение.

Что такое обсуждение?

Процессы, используемые для разделения различных приложений, которые выполняются в указанное время на одном компьютере. Операционная система не позволяет запускать процессы, но сделать потоков. Поток — это единица работы. Операционная система выделяет время процессора для потока для выполнения задачи потока. Один процесс может содержать несколько потоков выполнения. Каждый поток поддерживает собственные обработчики исключений, приоритет и набор структур, операционная система использует для сохранения контекста потока, если поток не может завершить его выполнение в течение времени, присвоенное процессора планирования. Контекст удерживается до следующего, поток получает время процессора. Этот контекст включает всю информацию, что поток требует беспрепятственно продолжить его выполнение. Эта информация включает набор регистров процессора и стек вызовов в адресном пространстве ведущего процесса потока.

Ссылки

Для получения сведений поиск справки Visual Studio для следующих ключевых слов:
  • SyncLock. Позволяет объекту будет заблокирован. Если другой поток пытается получить блокировку того же объекта, он блокируется, пока первый поток не освободит. Используйте SyncLock осторожно, поскольку может породить неправильное использование SyncLock. Например эту команду можно предотвращения состояния гонки, но приводить к взаимоблокировкам.
  • Конфликтов блокированных. Позволяет выбрать наборы потокобезопасные операции на базовых числовых переменных.
Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
316422 ИНФОРМАЦИЯ: План для работы с потоками в Visual Basic .NET
Дополнительные сведения см. на следующем сайте MSDN:
Потоки и работа с потоками

Свойства

Код статьи: 317723 - Последний отзыв: 29 октября 2013 г. - Revision: 5.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Ключевые слова: 
kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.
Эта статья на английском языке: 317723

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com