Я ранее задавал этот вопрос Удаление библиотечных зависимостей 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
?
К сожалению, текущая стандартная библиотека C ++ не предоставляет много возможностей для IPC и не включает никакой поддержки именованных мьютексов. (Это обеспечивает shared_mutex
но это другое дело.) Поэтому вы застряли с внешними зависимостями. Эта внешняя зависимость может быть Windows API, как вы сделали, или Boost (который обеспечивает named_mutex
), или что-то другое.
Я полностью понимаю ваше нежелание вводить зависимость от Boost. Но если вы попытаетесь справиться с этим самостоятельно и начнете добавлять поддержку альтернативных платформ, вы быстро обнаружите, что вы просто заново изобретаете библиотеки Boost и почти наверняка не добиваетесь хорошей работы. Таким образом, в этом случае вы должны взвесить ваши требования к мобильности против вашего отвращения к тому, чтобы укусить пулю и использовать Boost.
Других решений пока нет …