@dhonny101

Не удается открыть семафор, в чем ошибка?

Нужно реализовать две программы, моделирующие работу
процесса-производителя и процесса-потребителя. В программах необходимо
предусмотреть вывод сообщений о взаимодействии указанных процессов
посредством работы с общими файлами, моделирующими семафоры, а также
возможность управления порядком прохождения процессов через
критические участки.
Вот код процесса-производителя:
#include <iostream>
#include <fstream>
#include <windows.h>
#include <locale>
 
int main() {
    setlocale(LC_ALL, "rus");
    
 
    HANDLE semaphore = CreateSemaphoreW(nullptr, 1, 1, L"smph");
    if (semaphore == nullptr) {
        std::cout << "Не удалось создать семафор" << std::endl;
        return 1;
    }
    std::ofstream log_file("C:\\Users\\e1p\\log.txt"); // путь к файлу для записи рез-ов "42"
 
    WaitForSingleObject(semaphore, INFINITE); 
 
   
    int element = 42;
    log_file << element << std::endl;
    std::cout << "Процесс-производитель произвел элемент " << element << std::endl;
 
    ReleaseSemaphore(semaphore, 1, nullptr); 
 
    log_file.close();
    CloseHandle(semaphore); 
    return 0;
}


Вот код процесса-потребителя:
#include <iostream>
#include <fstream>
#include <windows.h>
#include <locale>
#include <string>
 
int main() {
     setlocale(LC_ALL, "rus");
 
     HANDLE semaphore = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS, FALSE, L"smph"); 
     GetLastError();
     if (semaphore == nullptr) {
         std::cout << "Не удалось открыть семафор" << std::endl;
         return 1;
     }
     std::ifstream log_file("C:\\Users\\e1p\\log.txt"); // путь к файлу для чтения рез-ов
     WaitForSingleObject(semaphore, INFINITE); 
 
     
     std::string element_str;
     std::getline(log_file, element_str);
     int element = std::stoi(element_str);
     std::cout << "Процесс-потребитель получил элемент " << element << std::endl;
 
     ReleaseSemaphore(semaphore, 1, nullptr);
 
     log_file.close();
     CloseHandle(semaphore); 
     return 0;
}


При запуске процесса-потребителя не удается открыть семафор.
В чем проблема?
  • Вопрос задан
  • 402 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
А он точно создается? Добавьте в процесс производителя вывод возвращаемого значения. Убедитесь, что семафор создан.

Может, там, вполне NULL возвращается. И да, лучше HANDLE не сравнивать с nullptr. Это, все-таки, не указатель.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
setlocale(LC_ALL, "");
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы