查看: 752|回复: 2

【求助】如何使用OpenThreads实现生产消费缓冲模型

[复制链接]

该用户从未签到

发表于 2015-4-1 17:10:04 | 显示全部楼层 |阅读模式
在编写通信模块时需要一个发送缓冲队列,原先在windows下使用win32的信号量可以实现生产消费模型,没有使用OpenThreads,为了跨平台,所以想用OpenThreads实现,但苦于OpenThreads库现有的信号量机制,无法实现,想求教下大侠们,有没有用OpenThreads实现过的。

使用win32的实现代码(标红的部分实现了 写、取、关闭的操作)
  1. <blockquote>////////////////////////////////////////////////////      
复制代码
////////////////////////////////////////////////////      
// CPP  
IOData::IOData( int iCountSemaphore /*= 1024*/ )
        {
                _iCountSemaphore = iCountSemaphore;
               
                TCHAR        tsName[1024] = { 0 };
                _stprintf(tsName, TEXT("IOData_Write_%d"), this);
                _hSemaphoreWrite = CreateSemaphore(NULL, 0, _iCountSemaphore, tsName);
                _stprintf(tsName, TEXT("IOData_Read_%d"), this);
                _hSemaphoreRead = CreateSemaphore(NULL, _iCountSemaphore, _iCountSemaphore, tsName);
                _stprintf(tsName, TEXT("IOData_Exit_%d"), this);
                _hExit = CreateEvent(NULL, FALSE, FALSE, tsName);
                ResetEvent(_hExit);
        }


        IOData::~IOData()
        {
                close();
                if ( _hSemaphoreWrite )
                {
                        CloseHandle(_hSemaphoreWrite);
                }
                if ( _hSemaphoreRead )
                {
                        CloseHandle(_hSemaphoreRead);
                }
                if ( _hExit )
                {
                        CloseHandle(_hExit);
                }
        }

        bool IOData::writeData( std::string strData )
        {
                HANDLE hWait[2] = { _hExit, _hSemaphoreRead };
                if ( WAIT_OBJECT_0 == WaitForMultipleObjects(2, hWait, FALSE, INFINITE) )
                {
                       logInfo("向外部发送信息的写入线程关闭");
                        return false;
                }

                _dataQueueMutex.lock();
                _dataQueue.push(strData);
                _dataQueueMutex.unlock();

                ReleaseSemaphore(_hSemaphoreWrite, 1, NULL);

                return true;
        }

        E_IOStatus IOData::readData( std::string & strData )
        {
                HANDLE hWait[2] = { _hExit, _hSemaphoreWrite };
                if ( WAIT_OBJECT_0 == WaitForMultipleObjects(2, hWait, FALSE, INFINITE) )
                {
                      logInfo("向外部发送信息的读取线程关闭");
                        return EIOS_Quit;
                }

                _dataQueueMutex.lock();

                strData = _dataQueue.front();
                _dataQueue.pop();

                _dataQueueMutex.unlock();

                ReleaseSemaphore(_hSemaphoreRead, 1, NULL);


                return EIOS_Normal;
        }

        bool IOData::close()
        {
                if ( !_hExit )
                {
                        return false;
                }
                BOOL bRet = PulseEvent(_hExit);
                if ( bRet )
                {
                        return false;
                }

                return true;
        }
}


相关帖子

该用户从未签到

发表于 2015-8-25 11:21:59 | 显示全部楼层
正在学习中!!!

该用户从未签到

发表于 2015-8-25 11:22:01 | 显示全部楼层
正在学习中!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表