1 Star 1 Fork 1

h_rain/rxlib

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
rx_os_sem.h 3.07 KB
一键复制 编辑 原始数据 按行查看 历史
h_rain 提交于 2021-01-12 16:07 . 统一代码格式.
#ifndef _RX_OS_SEM_H_
#define _RX_OS_SEM_H_
#include "rx_cc_macro.h"
#include "rx_assert.h"
#include <limits.h>
#if RX_OS_POSIX
#include <pthread.h>
#include <semaphore.h>
#include <memory.h>
#include <errno.h>
//-lpthread
#endif
namespace rx
{
#if RX_OS_POSIX
//---------------------------------------------------------
//对SEM旗标/信号量进行对象化功能封装
class semp_t
{
sem_t m_handle;
public:
//-----------------------------------------------------
semp_t() { memset(&m_handle, 0, sizeof(m_handle)); }
semp_t(uint32_t init_value) { memset(&m_handle, 0, sizeof(m_handle)); init(init_value); }
~semp_t() { uninit(); }
//-----------------------------------------------------
//初始化旗标,告知初始值
bool init(uint32_t init_value = 0) { return 0 == sem_init(&m_handle, 0, init_value); }
//-----------------------------------------------------
//解除旗标初始化
void uninit() { sem_destroy(&m_handle); }
//-----------------------------------------------------
//获取计数,可进行超时等待(默认无限等待)
//返回值:是否正确取得了计数
bool take(int wait_ms = -1)
{
if (wait_ms == 0)
return 0 == sem_trywait(&m_handle);
else if (wait_ms == -1)
return 0 == sem_wait(&m_handle);
else
{
//使用原生超时等待容易被系统时间的调整干扰致死,这里使用多次循环模拟(不太精准)
for (int i = 0; i < wait_ms; ++i)
{
if (0 == sem_trywait(&m_handle))
return true;
else if (EINVAL == errno)
return false;
usleep(1000);
}
return false;
}
}
//-----------------------------------------------------
//提交计数,可解除对方的等待
bool post()
{
return 0 == sem_post(&m_handle);
}
};
#elif RX_IS_OS_WIN
//---------------------------------------------------------
//对SEM旗标/信号量进行对象化功能封装
class semp_t
{
HANDLE m_handle;
public:
//-----------------------------------------------------
semp_t() :m_handle(NULL) {}
semp_t(uint32_t init_value) :m_handle(NULL) { init(init_value); }
~semp_t() { uninit(); }
//-----------------------------------------------------
//初始化旗标,告知初始值
bool init(uint32_t init_value = 0)
{
rx_assert(m_handle == NULL);
m_handle = CreateSemaphore(NULL, (long)init_value, LONG_MAX, NULL);
return NULL != m_handle;
}
//-----------------------------------------------------
//解除旗标初始化
void uninit() { CloseHandle(m_handle); m_handle = NULL; }
//-----------------------------------------------------
//获取计数,可进行超时等待(默认无限等待)
//返回值:是否正确取得了计数
bool take(int wait_ms = -1)
{
if (wait_ms == 0)
return WAIT_OBJECT_0 == WaitForSingleObject(m_handle, 0);
else if (wait_ms == -1)
return WAIT_OBJECT_0 == WaitForSingleObject(m_handle, INFINITE);
else
return WAIT_OBJECT_0 == WaitForSingleObject(m_handle, wait_ms);
}
//-----------------------------------------------------
//提交计数,可解除对方的等待
bool post()
{
return !!ReleaseSemaphore(m_handle, 1, NULL);
}
};
#endif
}
#endif // _HX_SEM_H_
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/_rain_/rxlib.git
[email protected]:_rain_/rxlib.git
_rain_
rxlib
rxlib
master

搜索帮助