重写类以使其更通用,以实现可移植性

Rewriting a class to be more generic for portability

本文关键字:实现 可移植性 重写      更新时间:2023-10-16

我之前问过这个问题 删除Windows库依赖项关于删除 Windows 库依赖项。用户:https://stackoverflow.com/users/214671/matteo-italia 已经解释过,对于Threads,您可以用std::mutex替换Windows特定的代码,但至于Processes,标准中目前没有任何内容,这是我接受的答案。

在另一个很好的答案中,用户:https://stackoverflow.com/users/7594711/soronelhaetir 建议使用boost-interprocess。但是,我当前的项目boost是免费的。

对于当前类:

块进程:

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 的厌恶。