Переписать класс, чтобы сделать его более универсальным для переносимости

Я ранее задавал этот вопрос Удаление библиотечных зависимостей Windows
об удалении библиотечных зависимостей Windows. Пользователь: https://stackoverflow.com/users/214671/matteo-italia уже объяснил, что для Threads Вы можете заменить специфичный для Windows код std::mutex но что касается Processes в настоящее время в стандарте нет ничего, что я бы принял.

В другом хорошем ответе пользователя: https://stackoverflow.com/users/7594711/soronelhaetir предложил использовать boost-interprocess, Однако мой текущий проект boost свободно.

С этим текущим классом:

BlockProcess:

BlockProcess.h

#ifndef BLOCK_PROCESS_H
#define BLOCK_PROCESS_H

#include <Windows.h>
#include <process.h>
#include <string>

namespace demo {

class BlockProcess final {
private:
HANDLE hMutex_;
public:
explicit BlockProcess( const std::string& strName );
~BlockProcess();

bool isBlocked() const;

BlockProcess( const BlockProcess& c ) = delete;
BlockProcess& operator=( const BlockProcess& c ) = delete;
};

} // namespace demo

#endif // !BLOCK_PROCESS_H

BlockProcess.cpp

#include "BlockProcess.h"
namespace demo {

BlockProcess::BlockProcess( const std::string& strName ) {
hMutex_ = CreateMutex( nullptr, FALSE, strName.c_str() );
}

BlockProcess::~BlockProcess() {
CloseHandle( hMutex_ );
}

bool BlockProcess::isBlocked() const {
return (hMutex_ == nullptr || GetLastError() == ERROR_ALREADY_EXISTS);
}

} // namespace demo

Мой вопрос все еще частично тот же: removing windows dependencies но теперь становится: есть ли способ, которым я могу переписать этот класс в общем виде, чтобы я не склонен использовать: #include <Windows.h> не используя сторонние библиотеки, такие как boost?

0

Решение

К сожалению, текущая стандартная библиотека C ++ не предоставляет много возможностей для IPC и не включает никакой поддержки именованных мьютексов. (Это обеспечивает shared_mutex но это другое дело.) Поэтому вы застряли с внешними зависимостями. Эта внешняя зависимость может быть Windows API, как вы сделали, или Boost (который обеспечивает named_mutex), или что-то другое.

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]