我以前曾问过Removing Windows library dependencies关于删除Windows依赖项的问题。用户:https://stackoverflow.com/users/214671/matteo-italia已经解释过,对于Threads,您可以用std::mutex替换特定于windows的代码,但是对于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 )
发布于 2018-01-25 19:58:08
不幸的是,当前的C++标准库并没有以IPC的方式提供太多,也不包括任何命名的互斥对象支持。(它提供了shared_mutex,但这是另一回事。)因此,您将陷入外部依赖关系。这种外部依赖可以像您所做的那样是Windows,或者Boost (它提供了一个named_mutex),或者其他的东西。
我完全理解你不愿意引入对Boost的依赖。但是,如果您自己尝试处理这个问题,并开始添加替代平台支持,您很快就会发现,您只是在重新创建Boost库,而且几乎肯定没有做得那么好。因此,在这种情况下,您应该权衡您对可移植性的需求和对咬子弹和使用Boost的厌恶。
https://stackoverflow.com/questions/48450779
复制相似问题