다른 프로세스에 주입되는 자체 DLL이 있습니다. 다른 프로세스에서 DLL은 내 응용 프로그램에 boost::message_queue을 통해 IPC 메시지를 보냅니다. 나는 다음과 같은 메시지를 구성하는 표준 : : 이제 stringstream을 사용하고 있습니다 :std :: stringstream 버그?
AddMessageParameter("CLIENT__TABLE__PLAYER_BANKROLL");
AddMessageParameter(window_handle);
AddMessageParameter(seat);
AddMessageParameter(s);
SendMessage();
이제이 같은 메시지를 생성 다음 DLL에서
class Client
{
...
private:
template <class T> void AddMessageParameter(const T &m)
{
_message << m << "|";
}
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;
};
, 기능 중 하나는 지속적으로 다음과 같은 메시지 전송 CLIENT_TABLE_PLAYER_BANKROLL|00211606|6|€1.28|
. 문제는 몇 천 개의 메시지마다 첫 번째 매개 변수가 추가되지 않고 메시지가 다음과 같이 표시된다는 것입니다. 00211606|6|€1.28|
왜 그런가요? 이 버그가 std :: stringstream에 있습니까? 아니면 제가 아마 뭔가 잘못하고 있습니까?
미리 도움을 청하십시오.
편집 :
문제가 해결되었습니다. 이것은 스레드 안전성의 문제였습니다. 간단한 뮤텍스가이를 해결했습니다.
+1 사이드 노트 – onof
사이드 노트 용 +1. –