重写 class 使其更通用以实现可移植性
Rewriting a class to be more generic for portability
我之前问过这个问题
关于删除 Windows 库依赖项。用户:https://whosebug.com/users/214671/matteo-italia 已经解释过,对于 Threads
,您可以用 std::mutex
替换 windows 特定代码,但是对于 Processes
,目前标准中没有任何内容我接受的答案。
在另一个好的回答用户中:https://whosebug.com/users/7594711/soronelhaetir 建议使用 boost-interprocess
。但是我当前的项目是 boost
免费的。
当前class:
块进程:
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
但现在变成了:有没有一种方法可以让我以通用的方式重写这个 class,这样我就不必使用:#include <Windows.h>
,而不使用任何第三方库,例如 boost
?
不幸的是,当前的 C++ 标准库并没有提供太多 IPC 方式,也不包含任何命名互斥锁支持。 (它提供了shared_mutex
but that's a different thing.) Therefore you're stuck with external dependencies. That external dependency can be the Windows API as you've done, or Boost (which provides a named_mutex
),或者别的东西。
我完全理解您不愿意引入对 Boost 的依赖。但是,如果您尝试自己处理这个问题并开始添加替代平台支持,您很快就会发现您只是在重新发明 Boost 库,而且几乎肯定做得不好。因此,在这种情况下,您应该权衡您对便携性的要求与您对咬紧牙关和使用 Boost 的厌恶。
我之前问过这个问题Threads
,您可以用 std::mutex
替换 windows 特定代码,但是对于 Processes
,目前标准中没有任何内容我接受的答案。
在另一个好的回答用户中:https://whosebug.com/users/7594711/soronelhaetir 建议使用 boost-interprocess
。但是我当前的项目是 boost
免费的。
当前class:
块进程:
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
但现在变成了:有没有一种方法可以让我以通用的方式重写这个 class,这样我就不必使用:#include <Windows.h>
,而不使用任何第三方库,例如 boost
?
不幸的是,当前的 C++ 标准库并没有提供太多 IPC 方式,也不包含任何命名互斥锁支持。 (它提供了shared_mutex
but that's a different thing.) Therefore you're stuck with external dependencies. That external dependency can be the Windows API as you've done, or Boost (which provides a named_mutex
),或者别的东西。
我完全理解您不愿意引入对 Boost 的依赖。但是,如果您尝试自己处理这个问题并开始添加替代平台支持,您很快就会发现您只是在重新发明 Boost 库,而且几乎肯定做得不好。因此,在这种情况下,您应该权衡您对便携性的要求与您对咬紧牙关和使用 Boost 的厌恶。