2015-11-06 81 views
2

我创建其中将数据放入其定义如下消息队列线程:C++处理队列溢出

std::deque<struct MessageDetails> MsgQueue; 

struct MessageDetails{ 
    char msg[256]; 
    uint64_t Signature; 
    int32_t Id; 
    int32_t Mask; 
    bool Valid; 
}; 

理想情况下,其它模块应该从这个队列并处理它pop的数据。 但是,对于我的代码中的错误处理,如果其他模块没有处理任何数据(或没有处理得太快),则消息队列大小不断增加,并且可能在某个时间点导致溢出。

我想知道它何时会溢出(分配的大小是多少?)以及如何处理?我能捕捉到什么错误吗?

+0

如果答案解决您的问题,你必须正确标注它。 –

回答

1

你可以尝试添加同时插入dequeu一个try catch块:

try { 
    MsgQueue.insert(xxx) 
} catch (std::bad_alloc & e) { 
    //Add logic to handle queue overflow 
} 

,你也可以做比较

MsQueue.max_size() and MsQueue.size() 

,如果没有足够的能力尝试

MsQueue.resize 
+0

我不确定是否可以比较MsQueue.max_size()和MsQueue.size()。如max_size()文档中所述,它表示: 由于已知的系统或库实现限制,这是容器可以达到的最大潜在大小,但容器无法保证能够达到该大小:它仍然可能无法在达到该大小之前的任何时间分配存储空间。 如果它在达到max_size之前未能分配什么可以完成? – Namitha

1

如果您有添加到队列中的项目的计数,您可以看到以下代码链接。

queue::max_size

+0

不能保证容器能够达到这样的大小:在达到大小之前,它仍然可能无法在任何时候分配存储空间。 – Namitha

+0

您可以随时使用如Akhil(@Akhil Thayyil)答案中提到的try catch块来捕获此类异常。 –