删除Windows库依赖项

时间:2018-01-25 18:58:22

标签: c++ multithreading std mutex portability

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

我想知道的是使用std库中的某些内容(例如std::mutexstd::thread等提供相同功能的等效方法。我想删除#include<windows.h>&amp;可能#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

修改

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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