Добавил:
Факультет ИКСС, группа ИКВТ-61 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

LAB / WORK_8 / parent / main

.cpp
Скачиваний:
33
Добавлен:
20.02.2019
Размер:
2.07 Кб
Скачать
// Пример синхронизации потоков, выполняющихся
// в разных процессах, с использованием мьютекса
#include <windows.h>
#include <iostream>
using namespace std;

int main()
{
    HANDLE hMutex;
    LPCWSTR appName = TEXT("C:\\Users\\hitma\\OneDrive\\ROOT\\SPSUT\\OPERATING SYSTEMS\\LAB\\WORK_8\\meta\\01\\child.exe");
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    // создаем мьютекс
    hMutex = CreateMutex(nullptr, FALSE, TEXT("DemoMutex"));
    if (hMutex == nullptr)
    {
        printf("CreateMutex error: %d\n", static_cast<int>(GetLastError()) );
        printf("\nPress any key to exit.");
        cin.get();
        return 0;
    }
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    // создаем новый консольный процесс
    if (!CreateProcess(appName, nullptr, nullptr, nullptr, FALSE,
                       0, nullptr, nullptr, &si, &pi))
    {
        printf("CreateProcess error: %d\n", static_cast<int>(GetLastError()) );
        cout << "Press any key to exit." << endl;
        cin.get();
    }
    // выводим на экран строки
    for (int j = 0; j < 10; j++)
    {
        // захватываем мьютекс
        WaitForSingleObject(hMutex, INFINITE);
        for (int i = 0; i < 10; i++)
        {
            cout << j << ' ';
            cout.flush();
            Sleep(100);
        }
        cout << endl;
        // освобождаем мьютекс
        ReleaseMutex(hMutex);
    }
    // закрываем дескриптор мьютекса
    CloseHandle(hMutex);
    // ждем пока дочерний процесс закончит работу
    WaitForSingleObject(pi.hProcess, INFINITE);
    // закрываем дескрипторы дочернего процесса в текущем процессе
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    return 0;
}