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