0

我之前曾问过这个关于删除 Windows 库依赖项的问题删除 Windows 库依赖项。用户:https ://stackoverflow.com/users/214671/matteo-italia已经解释过,Threads您可以用替换 Windows 特定代码,std::mutex但至于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

4

1 回答 1

2

不幸的是,当前的 C++ 标准库没有提供太多的 IPC 方式,并且不包括任何命名的互斥体支持。(它提供了shared_mutex,但那是另一回事。)因此你被外部依赖所困。该外部依赖项可以是您所做的 Windows API,也可以是 Boost(提供named_mutex)或其他东西。

我完全理解你不愿意引入对 Boost 的依赖。但是,如果您尝试自己处理这个问题并开始添加替代平台支持,您会很快发现您只是在重新发明 Boost 库,而且几乎可以肯定没有做得那么好。因此,在这种情况下,您应该权衡您对便携性的要求与您对硬着头皮使用 Boost 的厌恶。

于 2018-01-25T19:58:08.390 回答