none
Безопасное вложение циклов TPL RRS feed

  • Вопрос

  • Добрый вечер!

    Попросили вынести в отдельный вопрос.

    Могут ли возникнуть блокировки и гонки при использовании нескольких Parallel.For без явных обращений к общим ресурсам, например, если каждый создаваемый им поток будет, в свою очередь, запускать ещё Parallel.For, а каждый из них - ещё и т.д.? Какие могут быть неоднозначные ситуации?

    Спасибо.


    12 февраля 2019 г. 19:51

Ответы

  • Если нет разделяемых (общих) ресурсов, то никаких гонок и локов возникнуть не должно.


    Однако, не все так просто.

    Всем советую прочитать книгу (можно скачать официально бесплатно) Patterns for Parallel Programming (моя настольная книга). В разделе False sharing приведен пример сильной просадки производительности из-за обращения потоков к разным экземплярам класса Random. Логически общих ресурсов нет. Но физически они разделяют общую линию памяти. В результате - частое обновление памяти - потоки мешают друг другу.

    Вот за такие милые нюансы мы и любим многопоточность и параллельность. Ведь правда? :)

    • Помечено в качестве ответа Энтомолог 13 февраля 2019 г. 14:37
    13 февраля 2019 г. 11:24
  • Здравствуйте,

    Для ознакомления с общими принципами посмотрите:


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.


    13 февраля 2019 г. 11:45
    Модератор

Все ответы

  • Если нет разделяемых (общих) ресурсов, то никаких гонок и локов возникнуть не должно.


    Однако, не все так просто.

    Всем советую прочитать книгу (можно скачать официально бесплатно) Patterns for Parallel Programming (моя настольная книга). В разделе False sharing приведен пример сильной просадки производительности из-за обращения потоков к разным экземплярам класса Random. Логически общих ресурсов нет. Но физически они разделяют общую линию памяти. В результате - частое обновление памяти - потоки мешают друг другу.

    Вот за такие милые нюансы мы и любим многопоточность и параллельность. Ведь правда? :)

    • Помечено в качестве ответа Энтомолог 13 февраля 2019 г. 14:37
    13 февраля 2019 г. 11:24
  • Здравствуйте,

    Для ознакомления с общими принципами посмотрите:


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.


    13 февраля 2019 г. 11:45
    Модератор