СЛУЧАЙ 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)
}
Решение. Значит, в этом случае мы используем разные объекты критической секции для разных методов?? Я прав в обоих случаях?
Мне не понятна концепция объекта критического раздела при работе с несколькими функциями. Пожалуйста, помогите мне понять концепцию. Я пробовал в Интернете, но не смог найти соответствующий источник, который мог бы развеять мои сомнения.