C ++ очередь не любит менее 8 символов * с - PullRequest
1 голос
/ 20 июля 2011

Программа, написанная на C ++, читает из сетевого сокета, а затем записывает в локальный сокет. Он использует отдельный поток для «чтения».

Когда сообщение читается, оно помещается в очередь char * (используя мьютекс из библиотек boost, чтобы сделать его потокобезопасным).

Тем временем очередь проверяется, чтобы увидеть, пуста ли она, если нет, то первое сообщение извлекается из очереди (опять же с использованием мьютекса) и записывается в локальный сокет как символ *.

Моя проблема: когда сообщение 4 байта помещается в очередь, очередь сохраняет его без проблем, однако при повторной записи сообщения оно увеличивается до восьми байтов! «Новые» четыре байта равны нулю.


Пример A

Message in: {4,0,0,0}
Saved to queue as; <4>, <0>, <0>, <0>
Read from queue as:  <4>, <0>, <0>, <0>, <0>, <0>, <0>, <0>

Пример B

Message in: {4,0,0,0,8,0,0,0}
Saved to queue as; <4>, <0>, <0>, <0>, <8>, <0>, <0>, <0>
Read from queue as:  <4>, <0>, <0>, <0>, <8>, <0>, <0>, <0>

Есть идеи относительно причины этого? Может ли класс очереди справиться только с минимальным количеством символов? (Не подумал бы, что есть «пустой» метод). (Это не главная проблема, так как я никогда не говорю меньше восьми байтов; я просто хочу знать, если это произойдет и нападет на меня позже в жизни.)

Я немного покопался в Интернете и изучил документацию и обнаружил странную ссылку на буфер, но, похоже, это больше связано с использованием очереди в качестве буфера, а не с ее наличием ...

Другая информация;

ОС: RedHat

IDE: Eclipse


Код: Очередь

//Thread-safe call to save the message to the queue
void MessageQueue::SaveToQueue(char* Data)
{
// Lock the mutex to prevent any other threads accessing this member (released when method exits).
boost::mutex::scoped_lock l(m_Msg);

//int i = 0;
//while (i < sizeof(Data))//iLength)
//{
//  unsigned int ByteVaule = Data[i];//pBuffer[i];//ByteValue = int(pBuffer[i]);//unsigned int(pBuffer[i]);
//  cout << "Buffer in Queue" << i << ": " << ByteVaule << endl;
//  i++;
//}

MsgQ.push(Data);
}

//Thread-safe call to get the message from the queue
char* MessageQueue::GetFromQueue()
{
// Lock the mutex to prevent any other threads accessing this member (released when method exits).
boost::mutex::scoped_lock l(m_Msg);
char* message = MsgQ.front();
MsgQ.pop();
return message;
}

//Thread-safe call to check if the queue is empty
bool MessageQueue::IsEmpty()
{
// Lock the mutex to prevent any other threads accessing this member (released when method exits).
boost::mutex::scoped_lock l(m_Msg);
return MsgQ.empty();
}

Код: менеджер int iStatus = 0;

//Start class to store message queue
MessageQueue* pQueue = new MessageQueue();

// Current hard coded value for the write scoket location
// TODO: change this to reading from enviroment variable
string WritePath = "DefaultSocket";

ReadSocket* pRead = new ReadSocket();
WriteSocket* pWrite = new WriteSocket();
cout << "Creating read socket" << endl;
iStatus = pRead->CreateSocket(pQueue);
cout << "Creating write socket." << endl;
iStatus = pWrite->CreateSocket(WritePath);

//while is running, check the message container and process it as needed
while (pRead->IsRunning())
{
    while (!(pQueue->IsEmpty()))
    {
        char* Msg = pQueue->GetFromQueue();

        iStatus = pWrite->WriteToSocket(Msg);
        // TODO: catch on failure
    }
    //sleep(1);
}
//Destroy sockets as program is closing
pWrite->~WriteSocket();
pRead->~ReadSocket();

// TODO: add exception?
//Token return
return iStatus;

Чтобы сделать это слишком длинным и сложным, сокеты чтения и записи такие же, как в

http://www.linuxhowtos.org/C_C++/socket.htm

Символ чтения * сохраняется в очереди с помощью

SaveToQueue()

метод и взят из очереди с помощью

GetFromQueue

способ.

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Для информации;

Char * - указатель на тип char и занимает 8 байтов (зависит от машины?), Что означает, что когда я пытаюсь вывести содержимое указателя, он выводит весь его размер 8 байтов; за четырьмя, за которыми я хочу, следуют четыре пустых.

Чтобы убедиться в этом, вы можете использовать следующий код:

/*
 * main.cpp
 *
 *  Created on: Jul 20, 2011
 *      Author: Andy
 */
#include <iostream>
using namespace std;
int main ()
{
cout << "**** Size of ****\n" << endl;
char * Lemon;
char apple;
Lemon = "It's a long way to Tipperary";
int sizeOfApple = sizeof(apple);
int sizeOfLemon = sizeof(Lemon);
cout << "sizeOfApple is: " << sizeOfApple << endl;
cout << "sizeOfLemon is: " << sizeOfLemon << endl;
cout << "Lemon is: " << Lemon << endl;
return 0;
}

Что дает вам следующее O / P;

sizeOfApple is: 1
sizeOfLemon is: 8
Lemon is: It's a long way to Tipperary

Так что я мог бы использовать char и избавить себя от вопроса!

0 голосов
/ 20 июля 2011

std::queue не имеет такого ограничения. То, что вы видите, должно быть результатом проблем в вашем коде. (Вы сами говорите, что никогда не берете меньше 8 байт?!)

Редактировать: То, что кажется странным в примерах кода, - это управление памятью (явные вызовы деструкторов вместо delete ; память char* -s, похоже, не освобождается - как это это выделено?).

...