我在这里有几个类,我想删除窗口库依赖项,这是出于可移植性的原因。一个用于阻塞进程,另一个用于阻塞线程。这两个类都编译和编译运行良好...对于BlockProcess
类,它当前使用HANDLE
作为互斥锁并使用函数调用,例如:{CreateMutex()
,CloseHandle()
& GetLastError()
}。对于BlockThread
类,它使用指向CRITICAL_SECTION
调用函数的指针,例如:{EnterCricticalSection()
& LeaveCriticalSection()
}。
我想知道的是使用std
库中的某些内容(例如std::mutex
,std::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
修改
如果您需要使用这些类的示例,请随时发表评论。
答案 0 :(得分:2)
您的BlockThread
基本上是std::lock_guard
(用于std::mutex
代替CRITICAL_SECTION
)。它可以简单地用标准库代码替换。
至于BlockProcess
(创建跨进程同步对象),没有标准等价物。
答案 1 :(得分:2)
boost interprocess确实提供了跨平台的进程间同步对象(类似于标准库的线程间对象)。但标准库类型纯粹是在进行中。