删除 Windows 库依赖项

Removing Windows library dependencies

我这里有几个 class 出于可移植性的原因,我想删除 window 库依赖项。一个用于阻塞进程,另一个用于阻塞线程。这两个 classes 编译和运行正常......至于 BlockProcess class 它目前正在使用 HANDLE 作为互斥锁并使用函数调用,例如: {CreateMutex(), CloseHandle() & GetLastError()}。至于 BlockThread class 它使用指向 CRITICAL_SECTION 调用函数的指针,例如:{EnterCricticalSection() & LeaveCriticalSection()}。

我想知道是否有一种等效的方法可以使用 std 库(例如 std::mutexstd::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 确实提供了跨平台的进程间同步对象(类似于标准库的线程间对象)。但是标准库类型是纯进程中的。