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

СЛУЧАЙ I:

Сценарий: у меня есть два разных метода, каждый из которых использует общий глобальный ресурс. К Method1() обращаются ThreadA и Method2() многие другие потоки, но не 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 покинет критическую секцию, прежде чем он начнет выполнять метод2.

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

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

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

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


person O D    schedule 18.11.2014    source источник
comment
Да, в этом случае вам нужны две критические секции.   -  person Alex F    schedule 18.11.2014
comment
Критическая секция в Windows — это просто легкий мьютекс, локальный для процесса.   -  person MSalters    schedule 18.11.2014


Ответы (2)


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

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

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

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

person MSalters    schedule 18.11.2014

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

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

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

person ravi    schedule 18.11.2014