删除 Windows 库依赖项
Removing Windows library dependencies
我这里有几个 class 出于可移植性的原因,我想删除 window 库依赖项。一个用于阻塞进程,另一个用于阻塞线程。这两个 classes 编译和运行正常......至于 BlockProcess
class 它目前正在使用 HANDLE
作为互斥锁并使用函数调用,例如: {CreateMutex()
, CloseHandle()
& GetLastError()
}。至于 BlockThread
class 它使用指向 CRITICAL_SECTION
调用函数的指针,例如:{EnterCricticalSection()
& LeaveCriticalSection()
}。
我想知道是否有一种等效的方法可以使用 std
库(例如 std::mutex
、std::thread
等提供相同功能的内容来执行此操作.我想消除 #include<windows.h>
和可能 #include<process.h>
.
的需要
这是我现有的 classes:
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);
}
BlockThread.h
#ifndef BLOCK_THREAD_H
#define BLOCK_THREAD_H
#include <Windows.h>
namespace demo {
class BlockThread final {
private:
CRITICAL_SECTION* pCriticalSection_;
public:
explicit BlockThread( CRITICAL_SECTION& criticalSection );
~BlockThread();
BlockThread( const BlockThread& c ) = delete;
BlockThread& operator=( const BlockThread& c ) = delete;
};
} // namespace demo
#endif // !BLOCK_THREAD_H
} // namespace demo
BlockThread.cpp
#include "BlockThread.h"
namespace demo {
BlockThread::BlockThread( CRITICAL_SECTION& criticalSection ) {
pCriticalSection_ = &criticalSection;
EnterCriticalSection( pCriticalSection_ );
}
BlockThread::~BlockThread() {
LeaveCriticalSection( pCriticalSection_ );
}
} // namespace demo
编辑
如果您需要这些 class 如何使用的示例,请随时发表评论。
您的 BlockThread
本质上是 std::lock_guard
(用于 std::mutex
而不是 CRITICAL_SECTION
)。它可以简单地用标准库代码替换。
至于BlockProcess
(跨进程同步对象的创建),没有标准的等价物。
boost interprocess 确实提供了跨平台的进程间同步对象(类似于标准库的线程间对象)。但是标准库类型是纯进程中的。
我这里有几个 class 出于可移植性的原因,我想删除 window 库依赖项。一个用于阻塞进程,另一个用于阻塞线程。这两个 classes 编译和运行正常......至于 BlockProcess
class 它目前正在使用 HANDLE
作为互斥锁并使用函数调用,例如: {CreateMutex()
, CloseHandle()
& GetLastError()
}。至于 BlockThread
class 它使用指向 CRITICAL_SECTION
调用函数的指针,例如:{EnterCricticalSection()
& LeaveCriticalSection()
}。
我想知道是否有一种等效的方法可以使用 std
库(例如 std::mutex
、std::thread
等提供相同功能的内容来执行此操作.我想消除 #include<windows.h>
和可能 #include<process.h>
.
这是我现有的 classes:
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);
}
BlockThread.h
#ifndef BLOCK_THREAD_H
#define BLOCK_THREAD_H
#include <Windows.h>
namespace demo {
class BlockThread final {
private:
CRITICAL_SECTION* pCriticalSection_;
public:
explicit BlockThread( CRITICAL_SECTION& criticalSection );
~BlockThread();
BlockThread( const BlockThread& c ) = delete;
BlockThread& operator=( const BlockThread& c ) = delete;
};
} // namespace demo
#endif // !BLOCK_THREAD_H
} // namespace demo
BlockThread.cpp
#include "BlockThread.h"
namespace demo {
BlockThread::BlockThread( CRITICAL_SECTION& criticalSection ) {
pCriticalSection_ = &criticalSection;
EnterCriticalSection( pCriticalSection_ );
}
BlockThread::~BlockThread() {
LeaveCriticalSection( pCriticalSection_ );
}
} // namespace demo
编辑
如果您需要这些 class 如何使用的示例,请随时发表评论。
您的 BlockThread
本质上是 std::lock_guard
(用于 std::mutex
而不是 CRITICAL_SECTION
)。它可以简单地用标准库代码替换。
至于BlockProcess
(跨进程同步对象的创建),没有标准的等价物。
boost interprocess 确实提供了跨平台的进程间同步对象(类似于标准库的线程间对象)。但是标准库类型是纯进程中的。