Используйте язык сценариев, когда интерактивная операция важна, например, оболочка командной строки, или Вы экспортируете функциональность для других пользователей для использования в простых операциях. (Им не придется скомпилировать; сценарии достаточно)
«Потоковая безопасность» - это немного неудачный термин, потому что у него нет четкого определения. В основном это означает, что определенные операции над объектом гарантированно будут вести себя разумно, когда объект обрабатывается через несколько потоков.
Рассмотрим простейший пример: счетчик. Предположим, у вас есть два потока, которые увеличивают счетчик. Если последовательность событий выглядит так:
Затем обратите внимание, как счетчик «потерял» одно из приращений. Простые операции увеличения счетчиков не являются потокобезопасными; чтобы сделать их потокобезопасными, вы можете использовать блокировки или InterlockedIncrement.
Аналогично с очередями. Очереди, не защищенные потоками, могут «терять» очереди так же, как счетчики, не защищенные потоками, могут терять приращения. Хуже того, небезопасные очереди могут даже аварийно завершиться или привести к сумасшедшим результатам, если вы неправильно используете их в многопоточном сценарии.
Трудность с «потокобезопасностью» заключается в том, что она четко не определена. Означает ли это просто «не рухнет»? Значит ли это, что будут получены разумные результаты? Например, предположим, что у вас есть «потокобезопасная» коллекция. Это правильный код?
if (!collection.IsEmpty) Console.WriteLine(collection[0]);
Нет. Даже если коллекция "потокобезопасна", это не t означает, что этот код правильный; другой поток мог бы сделать коллекцию пустой после проверки, но до строки записи, и поэтому этот код мог дать сбой, даже если объект якобы является «потокобезопасным». Фактически определить, что каждая соответствующая комбинация операций является потокобезопасной, является чрезвычайно сложной проблемой.
Теперь перейдем к вашей реальной ситуации: любой, кто говорит вам, что «вам следует использовать класс Queue, это лучше, потому что это потокобезопасный ", вероятно, не имеет четкого представления о том, о чем они говорят. Во-первых, очередь не является потокобезопасной. Во-вторых, является ли Queue потокобезопасным или нет, совершенно не имеет значения, если вы используете объект только в одном потоке! Если у вас есть коллекция, доступ к которой будет осуществляться в нескольких потоках, то, как я указал в моем примере выше, у вас есть чрезвычайно сложная проблема, которую нужно решить, независимо от того, является ли сама коллекция «потокобезопасной». Вы должны определить, что каждая комбинация операций , которые вы выполняете над коллекцией, также является потокобезопасной. Это очень сложная проблема, и если вы столкнетесь с ней, то вам следует воспользоваться услугами эксперта по этой сложной теме.
К поточно-ориентированному типу можно безопасно обращаться из нескольких потоков, не беспокоясь о параллелизме. Обычно это означает, что этот тип доступен только для чтения.
Интересно, что Queue
не потокобезопасен - он может поддерживать одновременное чтение, пока очередь не ' t изменен, но это не то же самое, что безопасность потоков.
Чтобы подумать о безопасности потоков, подумайте, что произошло бы, если бы два потока обращались к Queue
, и появился третий поток и начал либо добавлять, либо удалять из этой очереди
. Поскольку этот тип не ограничивает такое поведение, он не является потокобезопасным.
При работе с многопоточностью обычно приходится иметь дело с проблемами параллелизма. Термин «проблемы параллелизма» относится к проблемам, которые конкретно возникают из-за возможности чередования инструкций из двух разных контекстов выполнения на ресурсе, совместно используемом обоими. Здесь, с точки зрения безопасности потоков, контексты выполнения - это два потока внутри процесса; однако в связанных предметах они могут быть процессами.
Меры безопасности потоков применяются в первую очередь для достижения двух целей. Во-первых, восстановить детерминизм в отношении того, что произойдет, если переключение контекста потоков (которое в противном случае контролируется ОС и, следовательно, в основном недетерминировано в программах пользовательского уровня), чтобы не допустить, чтобы определенные задачи оставались незавершенными или два контекста записываются в одно и то же место в памяти. В большинстве мер просто используется немного аппаратно поддерживаемых инструкций test-and-set и т.п., а также программных синхронизирующих конструкций , чтобы заставить все другие контексты выполнения оставаться в стороне. из одного типа данных, в то время как другой выполняет работу, которую нельзя прерывать.
Обычно объекты, доступные только для чтения, являются потокобезопасными. Многие объекты, не предназначенные только для чтения, могут иметь доступ к данным (только для чтения) без проблем в нескольких потоках, если объект не изменен в середине. Но это не потокобезопасность. Потоковая безопасность - это когда с типом данных выполняются всевозможные вещи, чтобы предотвратить любые модификации этого типа одним потоком, вызывающие повреждение данных или взаимоблокировку даже при работе с множеством одновременных операций чтения и записи.
а также конструкции синхронизации на уровне программного обеспечения , чтобы заставить все другие контексты выполнения держаться подальше от одного типа данных, в то время как другой выполняет работу, которую нельзя прерывать.Обычно объекты, доступные только для чтения. поточно-ориентированы. Многие объекты, не предназначенные только для чтения, могут иметь доступ к данным (только для чтения) без проблем в нескольких потоках, если объект не изменен в середине. Но это не потокобезопасность. Потоковая безопасность - это когда с типом данных выполняются всевозможные вещи, чтобы предотвратить любые модификации этого типа одним потоком, вызывающие повреждение данных или взаимоблокировку даже при работе с множеством одновременных операций чтения и записи.
а также конструкции синхронизации на уровне программного обеспечения , чтобы заставить все другие контексты исполнения держаться подальше от одного типа данных, в то время как другой выполняет работу, которую нельзя прерывать.Обычно объекты, доступные только для чтения. поточно-ориентированы. Многие объекты, не предназначенные только для чтения, могут иметь доступ к данным (только для чтения) без проблем в нескольких потоках, если объект не изменен в середине. Но это не потокобезопасность. Потоковая безопасность - это когда с типом данных выполняются всевозможные вещи, чтобы предотвратить любые модификации этого типа одним потоком, вызывающие повреждение данных или взаимоблокировку даже при работе с множеством одновременных операций чтения и записи.
Многие объекты, не предназначенные только для чтения, могут иметь доступ к данным (только для чтения) без проблем в нескольких потоках, если объект не изменен в середине. Но это не потокобезопасность. Потоковая безопасность - это когда с типом данных выполняются всевозможные вещи, чтобы предотвратить любые модификации этого типа одним потоком, вызывающие повреждение данных или взаимоблокировку даже при работе с множеством одновременных операций чтения и записи. Многие объекты, не предназначенные только для чтения, могут иметь доступ к данным (только для чтения) без проблем в нескольких потоках, если объект не изменен в середине. Но это не потокобезопасность. Потоковая безопасность - это когда с типом данных выполняются всевозможные вещи, чтобы предотвратить любые модификации этого типа одним потоком, вызывающие повреждение данных или взаимоблокировку даже при работе с множеством одновременных операций чтения и записи.