Что такое конфликт потоков?


может кто-нибудь, пожалуйста, объяснить просто, что такое нить раздора?

я погуглил его, но не могу найти простое объяснение.

10 83

10 ответов:

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

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

самый очевидный пример конфликта на замок. Если поток A имеет блокировку и поток B хочет получить то же самое блокировка, поток B должен будет ждать, пока поток A не освободит блокировку.

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

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

Почему? Скажем, каждый поток работает на своем собственном ядре на современном процессоре x86, и ядра не имеют общего кэша L2. С помощью только одного потока объект может оставаться в кэше L2 большую часть времени. При выполнении обоих потоков каждый раз, когда один поток изменяет объект, другой поток обнаружит, что данные не находятся в его кэше L2, потому что другой процессор аннулировал кэш линия. Например, на Pentium D это приведет к тому, что код будет выполняться со скоростью FSB, которая намного меньше скорости кэша L2.

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

Как ни странно, замки обычно уменьшить утверждение. Зачем? Поскольку без блокировки два потока могут работать с одним и тем же объектом или коллекцией и вызывать множество конфликтов (например, есть очереди без блокировки). Замки будут иметь тенденцию к deschedule конкурирующих потоков, что позволяет не-конкурирующих потоков, вместо того, чтобы бежать. Если поток A содержит блокировку, а поток B хочет такую же блокировку, реализация может запустить поток C вместо этого. Если поток C не нуждается в этой блокировке, то будущего конфликта между потоками A и B можно избежать на некоторое время. (Конечно, это предполагает, что есть и другие потоки, которые могут работать. Это не поможет, если только система в целом может сделать полезную работу, запустив потоки, которые утверждают.)

с здесь:

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

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

У вас есть 2 темы. Поток A и поток B, у вас также есть объект C.

A в настоящее время обращается к объекту C и поместил блокировку на этот объект. B должен получить доступ к объекту C, но не может этого сделать, пока A не освободит блокировку объекта C.

Я думаю, что должно быть некоторое разъяснение от OP на фоне вопроса - я могу придумать 2 ответа (хотя я уверен, что есть дополнения к этому списку):

  1. Если вы имеете в виду общую "концепцию" конкуренции потоков и то, как она может представляться в приложении, я откладываю подробный ответ @DavidSchwartz выше.

  2. существует также ".NET CLR Locks and Threads:Total # of Contentions' Performance Счетчик. Как следует из описания PerfMon для этого счетчика, он определяется как:

    этот счетчик отображает общее количество попыток потоков в среде CLR получить управляемую блокировку безрезультатно. Управляемые блокировки могут быть получены многими способами; с помощью оператора "lock" В C# или путем вызова System.Монитор.Введите или с помощью MethodImplOptions.Синхронизированный пользовательский атрибут.

...и я уверен, что другие для других ОС и каркас приложения.

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

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

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

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

С документация dotTrace

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

Как и в Примере, два случая дают значение соревнование.