删除 Windows 库依赖项

Removing Windows library dependencies

本文关键字:依赖 Windows 删除      更新时间:2023-10-16

我这里有几个类,出于可移植性的原因,我想删除窗口库依赖项。一个用于阻塞进程,另一个用于阻塞线程。这两个类都可以按原样编译并运行良好...... 至于BlockProcess类,它目前使用互斥锁的HANDLE并使用函数调用,例如:{CreateMutex()CloseHandle()&GetLastError()}。至于BlockThread类,它使用指向CRITICAL_SECTION调用函数的指针,例如:{EnterCricticalSection()&LeaveCriticalSection()}。

我想知道的是,是否有一种等效的方法可以使用std库中的某些内容来执行此操作,例如std::mutexstd::thread等,它将提供相同的功能。我想消除对#include<windows.h>和可能#include<process.h>的需求。

以下是我现有的课程:


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

编辑

如果您需要如何使用这些类的示例,请随时发表评论。

您的BlockThread本质上是std::lock_guard的(用于std::mutex而不是CRITICAL_SECTION)。它可以简单地替换为标准库代码。

至于BlockProcess(创建跨进程同步对象),没有标准的等效项。

boost interprocess 确实提供了跨平台的进程间同步对象(类似于标准库的线程间对象)。但标准库类型纯粹是进程中的。