Запуск двух функций одновременно

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

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

РЕДАКТИРОВАТЬ: На самом деле я рисую маркеры на картах Google, используя gmap.net. Я создал две функции потока для двух маркеров. Они будут извлекать необходимые данные из двух отдельных файлов. Конвертировать их в lat long и строить на map.with. При таком подходе я создаю дублирующие функции для обеих функций, имеющих одинаковую функциональность. Но я думаю, что это не очень хороший способ программирования, поэтому я хочу использовать одну общую функцию для построения и извлечения данных из файла для преобразования.

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

1 ответ

Похоже, 2 задачи с блокировкой должны делать то, что вы хотите:

class Program
{
    static void Main(string[] args)
    {
        var task1 = Task.Run(() => Func1());
        var task2 = Task.Run(() => Func2());

        Task.WaitAll(task1, task2);
    }

    static object lockObj = new object();

    static void Func1()
    {
        for (int i = 0; i < 10; i++)
        {
            Func3("Func1");
            Thread.Sleep(1);
        }
    }

    static void Func2()
    {
        for (int i = 0; i < 10; i++)
        {
            Func3("Func2");
            Thread.Sleep(1);
        }
    }

    static void Func3(string fromFn)
    {
        lock(lockObj)
        {
            Console.WriteLine("Called from " + fromFn);
        }
    }
}

Блокировка предотвращает запуск вложенного кода более чем в одном потоке одновременно. (The Sleep операторы предназначены только для замедления функций в демонстрационных целях - им не будет места в вашем конечном коде).

Выход:

Called from Func2
Called from Func1
Called from Func2
Called from Func1
Called from Func2
Called from Func1
Called from Func1
Called from Func2
Called from Func1
Called from Func2
Другие вопросы по тегам