首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::stringstream bug?

std::stringstream bug?
EN

Stack Overflow用户
提问于 2010-07-27 19:05:30
回答 1查看 625关注 0票数 1

我有自己的DLL,它被注入到另一个进程中。在另一个进程中,DLL通过boost::message_queue向我的应用程序发送IPC消息。我使用std::stringstream来构造消息,如下所示:

代码语言:javascript
复制
class Client
{
    ...

    private:
        template <class T> void AddMessageParameter(const T &m)
        {
            _message &lt&lt m &lt&lt "|";
        }

        void SendMessage()
        {
            if (_mq && _message.str().length() < 1024) {
                // Do not send the same message again.

                if (_mq_last_sent_message != _message.str()) {
                    _mq_last_sent_message = _message.str();

                    try {
                        unsigned int tries = 0;

                        // Try send the message five times before giving up.

                        do {
                            if (_mq->try_send(_mq_last_sent_message.c_str(), _mq_last_sent_message.length(), 0))
                                tries = 5;
                            else
                                ::Sleep(128);

                            ++tries;
                        } while (tries < 5);
                    } catch (...) {
                        // TODO: Add log4cxx logging here for errors...
                    }
                }
            }

            // Clear the message for a new one.

            _message.seekp(0);
            _message.clear();
            _message.str(std::string());
        }

    private:
        std::stringstream _message;
        std::string _mq_last_sent_message;
        boost::shared_ptr<boost::interprocess::message_queue> _mq;
};

在DLL中,其中一个函数不断发送以下消息:

代码语言:javascript
复制
AddMessageParameter("CLIENT__TABLE__PLAYER_BANKROLL");
AddMessageParameter(window_handle);
AddMessageParameter(seat);
AddMessageParameter(s);

SendMessage();

现在,这将生成一个类似于CLIENT_TABLE_PLAYER_BANKROLL|00211606|6|€1.28|的消息。问题是,在每几千条消息中,第一个参数没有相加,消息变得像00211606|6|€1.28|一样

为什么会这样呢?这是std::stringstream中的某个bug,还是我做错了什么?

提前感谢您的帮助。

编辑:

问题解决了。这是一个线程安全性的问题。一个简单的互斥锁解决了这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-27 19:28:00

您的代码在尝试发送最长的消息时失败。因此,我假设消息目标读取速度不够快。

我认为你尝试5次的概念是有缺陷的,因为如果你的消息没有被发送,你就会吞下它--你甚至没有处理这个严重的错误情况。就我个人而言,我建议要么永远等待发送你的消息,要么构建一个合理大小的本地缓冲区-如果这个缓冲区已满,那么你就永远等待。

我还建议您不要在不关心异常的情况下吃掉所有异常。你默默地隐藏着严重的错误。

顺便说一句:人们通常认为std::string有bug,或者操作系统有bug,甚至编译器有bug。让我向你保证,这些人的指控经常是错误的,以至于即使是最保守的悲观主义者也会说,他们总是错误的。那些正确的人可以在琐碎的程序中证明这一点。

请原谅我的傲慢。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3342931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档