Что делает ориентированный на многопотоковое исполнение средний?

Недавно я попробовал к Доступу, текстовое поле от потока (кроме потока UI) и исключение было брошено. Это сказало что-то о "коде, не являющемся ориентированным на многопотоковое исполнение" и таким образом, я закончил тем, что писал делегату (образец из MSDN помог) и назвать его вместо этого.

Но несмотря на это я не вполне понял, почему весь дополнительный код был необходим.

Обновление: я столкнусь с какими-либо серьезными проблемами, если я проверю

Controls.CheckForIllegalCrossThread..blah =true
114
задан 7 revs, 5 users 50% 6 December 2016 в 22:34
поделиться

5 ответов

У Эрика Липперта есть хорошая запись в блоге под названием What это то, что вы называете «потокобезопасным»? об определении безопасности потоков, найденном в Википедии.

3 важных момента, извлеченных из ссылок:

«Часть кода является потокобезопасной, если она правильно работает во время одновременное выполнение несколькими потоками »

« В частности, он должен удовлетворять потребность в нескольких потоках для доступ к одним и тем же совместно используемым данным,… »

«… и необходимость того, чтобы к совместно используемому фрагменту данных мог получить доступ только один нить в любой момент ».

Определенно стоит прочитать!

114
ответ дан 24 November 2019 в 02:32
поделиться

В простейшем из терминов threadsafe означает, что доступ к нему безопасен из нескольких потоков. Когда в программе используется несколько потоков, и каждый из них пытается получить доступ к общей структуре данных или ячейке в памяти, может случиться несколько плохих вещей. Таким образом, вы добавляете дополнительный код, чтобы предотвратить эти плохие вещи. Например, если два человека одновременно писали один и тот же документ, то второй сохраняющий его человек перезапишет работу первого. Чтобы сделать его безопасным, вы должны заставить человека 2 ждать, пока человек 1 выполнит свою задачу, прежде чем позволить человеку 2 редактировать документ.

98
ответ дан 24 November 2019 в 02:32
поделиться

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

Нормальной практикой WinForms является наличие одного потока, предназначенного для всей вашей работы с пользовательским интерфейсом.

1
ответ дан 24 November 2019 в 02:32
поделиться

Wikipedia имеет статью о безопасности потоков.

Эта страница определений (вы должны пропустить объявление - извините) Определяет его таким образом:

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

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

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

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

  • Работа над копиями данных
  • Добавление замков вокруг критического кода
16
ответ дан 24 November 2019 в 02:32
поделиться

HTML5 вводит понятие пользовательских атрибутов данных , которые может создать любой пользователь для присоединения пользовательских скрытых данных к элементам в целях создания сценариев. Просто создайте атрибут, используя префикс data- , например data-myattr1 или data-myattr2 , и заполните его своими данными.

<div data-myattr1="myvalue1" data-myattr2="myvalue2">Content</div>

Приятно, что это решение уже работает во всех основных браузерах; все они будут анализировать неизвестные атрибуты и предоставлять их в DOM для доступа по JavaScript. HTML5 добавляет несколько удобных механизмов доступа к ним, которые еще не реализованы, но для доступа к ним на данный момент можно просто использовать стандартный getAttribute . И тот факт, что они разрешены в HTML5, означает, что ваш код будет подтвержден, если вы готовы использовать проект стандарта в отличие от принятого (я не верю, что атрибуты data- являются особенно спорными, однако, поэтому я был бы удивлен, если бы они были удалены из стандарта).

Преимущество, которое это имеет по сравнению с атрибутами пространства имен в XHTML, заключается в том, что IE не поддерживает XHTML, поэтому вам придется реализовать что-то, что претендует на использование атрибутов пространства имен, но на самом деле просто использует недопустимые атрибуты с : в их имени, то есть как IE будет анализировать их. Это лучше, чем использование class , потому что вложение большого количества данных в атрибут class перегружает его довольно много и требует дополнительного анализа, чтобы извлечь различные части данных. И это лучше, чем просто создать свой собственный (который будет работать в текущих браузерах), потому что хорошо определено, что эти атрибуты с префиксом data- являются личными фрагментами данных для создания сценариев, и поэтому ваш код будет проверяться в HTML5 и никогда не будет конфликтовать с будущими стандартами.

Другой малоизвестный метод добавления пользовательских данных в HTML, который действителен даже в HTML- 4, это добавление элементов script с атрибутами type чего-либо, кроме text/javascript (или одного из пары других типов, которые можно использовать для указания JavaScript). Эти блоки скриптов будут игнорироваться браузерами, которые не знают, что с ними делать, и вы можете получить к ним доступ через DOM и делать с ними то, что хотите. HTML5 явно обсуждает это использование , но нет ничего, что делает его недействительным в старых версиях, и он работает во всех современных браузерах, насколько я знаю. Например, если вы хотите использовать CSV для определения таблицы данных:

<div>
  <script type="text/csv;header=present">
    id,myattr1,myattr2
    something,1,2
    another,2,4
  </script>
  Content
</div>

Это метод, используемый SVG Web , чтобы разрешить встраивание SVG в HTML, с эмуляцией через Flash, если браузер не поддерживает собственный SVG. В настоящее время даже браузеры, которые поддерживают SVG (Firefox, Safari, Chrome, Opera), не поддерживают его непосредственно в формате HTML, они поддерживают его только непосредственно в формате XHTML (поскольку элементы SVG находятся в другом пространстве имен). SVG Web позволяет поместить SVG в HTML,с помощью тэга сценария он преобразует эти элементы в соответствующее пространство имен и добавляет их в DOM, чтобы они могли быть визуализированы как XHTML. В браузерах, которые не поддерживают SVG, он также эмулирует функцию элементов с помощью Flash.

-121--1480085-

Вы можете выйти, нажав кнопку Back или вызвав finish () в Activity . Просто вызовите finish () из элемента меню , если вы хотите явно его отключить.

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

-121--1756802-

Модуль защищен от потоков, если он гарантирует сохранение своих инвариантов в условиях многопоточного и параллельного использования.

Здесь модуль может быть структурой данных, классом, объектом, методом/процедурой или функцией. В основном объём кода и связанные с ним данные.

Гарантия потенциально может быть ограничена определенными средами, такими как определенная архитектура ЦП, но должна быть сохранена для этих сред. Если нет явного разграничения сред, то обычно подразумевается, что для всех сред код может быть скомпилирован и выполнен.

Небезопасные для потоков модули могут функционировать правильно при многопоточном и параллельном использовании, но это часто больше зависит от везения и совпадения, чем от тщательного проектирования. Даже если какой-то модуль не сломается для вас под, он может сломаться при перемещении в другие среды.

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

4
ответ дан 24 November 2019 в 02:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: