Как объект Critical Section работает точно для нескольких методов

0

СЛУЧАЙ I:

Сценарий: у меня есть два разных метода, каждый из которых использует общий глобальный ресурс. Method1() осуществляется ThreadA и Method2() многими другими Threads, но не ThreadA.

Требование: мне нужно, если ThreadA обращается к Method1() нет другого доступа к потоку Method2().

Решение. Поэтому использование общего объекта критического раздела предотвратит любой конфликт в глобальном ресурсе. Напр.

Method1()
{
EnterCriticalSection(&cs)
    //Access common resource (Read/Write) lets say a global queue
LeaveCriticalSection(&cs)
}

Method2()
{
EnterCriticalSection(&cs)
    //Access common resource (Read/Write) lets say a global queue
LeaveCriticalSection(&cs)
}

СЛУЧАЙ II:

Сценарий: у меня есть два разных метода, и они не разделяют никаких ресурсов.

Требование: то, что мне требуется, это разные потоки, возможно, не запускает Method1() одновременно. Аналогично для Method2(). Но нет проблем, если какой-либо из потоков одновременно запускает оба метода. Напр. ThreadA и ThreadB оба могут одновременно не обращаться к Method1() но должно быть возможно, что ThreadA запускает Method1() а ThreadB запускает Method2(). В этом случае, если я использую один и тот же объект критического раздела в обоих методах, то позволяет сказать, что ThreadA запускает метод1, ThreadB должен ждать, пока ThreadA покинет критический раздел, прежде чем он начнет выполнение Method2.

Method1()
{
EnterCriticalSection(&cs)
    //Do something
LeaveCriticalSection(&cs)
}

Method2()
{
EnterCriticalSection(&cs)
    //Do Something
LeaveCriticalSection(&cs)
}

Решение. Итак, в этом случае мы используем другой объект критического раздела для разных методов? Правильно ли я в этих случаях?

Я не понимаю концепцию объекта критического сечения при работе с несколькими функциями. Пожалуйста, помогите мне в понимании концепции. Я пробовал онлайн, но не мог найти соответствующий источник, который мог бы устранить мои сомнения.

  • 1
    Да, вам нужны два критических раздела в этом случае.
  • 0
    «Критическая секция» в Windows - это просто легкий локальный мьютекс процесса.
Теги:
multithreading
winapi
critical-section

2 ответа

3
Лучший ответ

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

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

Технически это нормально для одного критического раздела для защиты двух ресурсов. Это может иметь смысл, если оба объекта всегда используются вместе. Фактически, вы можете запустить свою программу всего за один критический раздел за все. Неэффективно, но не неслыханно. Например, Python использует этот механизм (Global Interpreter Lock)

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

0

Ваши оба предположения верны в соответствии с требованиями.

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

Вы храните мьютексы в начале критических разделов, которые вы отпускаете после выхода из этой секции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню