Каков подразумеваемый 'ориентированный на многопотоковое исполнение' объект?

Используйте язык сценариев, когда интерактивная операция важна, например, оболочка командной строки, или Вы экспортируете функциональность для других пользователей для использования в простых операциях. (Им не придется скомпилировать; сценарии достаточно)

6
задан Rex M 12 October 2009 в 05:19
поделиться

3 ответа

«Потоковая безопасность» - это немного неудачный термин, потому что у него нет четкого определения. В основном это означает, что определенные операции над объектом гарантированно будут вести себя разумно, когда объект обрабатывается через несколько потоков.

Рассмотрим простейший пример: счетчик. Предположим, у вас есть два потока, которые увеличивают счетчик. Если последовательность событий выглядит так:

  • Первый поток читает со счетчика, получает ноль.
  • Поток два читает со счетчика, получает ноль.
  • Поток один увеличивает ноль, записывает один противостоять.
  • Заправляет два приращения нуля, пишет один для счетчика.

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

Аналогично с очередями. Очереди, не защищенные потоками, могут «терять» очереди так же, как счетчики, не защищенные потоками, могут терять приращения. Хуже того, небезопасные очереди могут даже аварийно завершиться или привести к сумасшедшим результатам, если вы неправильно используете их в многопоточном сценарии.

Трудность с «потокобезопасностью» заключается в том, что она четко не определена. Означает ли это просто «не рухнет»? Значит ли это, что будут получены разумные результаты? Например, предположим, что у вас есть «потокобезопасная» коллекция. Это правильный код?

if (!collection.IsEmpty) Console.WriteLine(collection[0]);

Нет. Даже если коллекция "потокобезопасна", это не t означает, что этот код правильный; другой поток мог бы сделать коллекцию пустой после проверки, но до строки записи, и поэтому этот код мог дать сбой, даже если объект якобы является «потокобезопасным». Фактически определить, что каждая соответствующая комбинация операций является потокобезопасной, является чрезвычайно сложной проблемой.

Теперь перейдем к вашей реальной ситуации: любой, кто говорит вам, что «вам следует использовать класс Queue, это лучше, потому что это потокобезопасный ", вероятно, не имеет четкого представления о том, о чем они говорят. Во-первых, очередь не является потокобезопасной. Во-вторых, является ли Queue потокобезопасным или нет, совершенно не имеет значения, если вы используете объект только в одном потоке! Если у вас есть коллекция, доступ к которой будет осуществляться в нескольких потоках, то, как я указал в моем примере выше, у вас есть чрезвычайно сложная проблема, которую нужно решить, независимо от того, является ли сама коллекция «потокобезопасной». Вы должны определить, что каждая комбинация операций , которые вы выполняете над коллекцией, также является потокобезопасной. Это очень сложная проблема, и если вы столкнетесь с ней, то вам следует воспользоваться услугами эксперта по этой сложной теме.

26
ответ дан 8 December 2019 в 02:53
поделиться

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

Интересно, что Queue не потокобезопасен - он может поддерживать одновременное чтение, пока очередь не ' t изменен, но это не то же самое, что безопасность потоков.

Чтобы подумать о безопасности потоков, подумайте, что произошло бы, если бы два потока обращались к Queue , и появился третий поток и начал либо добавлять, либо удалять из этой очереди . Поскольку этот тип не ограничивает такое поведение, он не является потокобезопасным.

5
ответ дан 8 December 2019 в 02:53
поделиться

При работе с многопоточностью обычно приходится иметь дело с проблемами параллелизма. Термин «проблемы параллелизма» относится к проблемам, которые конкретно возникают из-за возможности чередования инструкций из двух разных контекстов выполнения на ресурсе, совместно используемом обоими. Здесь, с точки зрения безопасности потоков, контексты выполнения - это два потока внутри процесса; однако в связанных предметах они могут быть процессами.

Меры безопасности потоков применяются в первую очередь для достижения двух целей. Во-первых, восстановить детерминизм в отношении того, что произойдет, если переключение контекста потоков (которое в противном случае контролируется ОС и, следовательно, в основном недетерминировано в программах пользовательского уровня), чтобы не допустить, чтобы определенные задачи оставались незавершенными или два контекста записываются в одно и то же место в памяти. В большинстве мер просто используется немного аппаратно поддерживаемых инструкций test-and-set и т.п., а также программных синхронизирующих конструкций , чтобы заставить все другие контексты выполнения оставаться в стороне. из одного типа данных, в то время как другой выполняет работу, которую нельзя прерывать.

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

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

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

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

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

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

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

1
ответ дан 8 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

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