Как скопировать данные в буфер куда-нибудь в памяти (char *) - PullRequest
2 голосов
/ 16 июня 2011
int str_len = read(m_events[i].data.fd, buf, BUF_SIZE);

У меня есть это, и я читаю данные в buf, объявленный как

char buf[BUF_SIZE];

То, что я пытаюсь сделать, это то, что я пытаюсь получить данные и передать их WorkHanndler, который я определил, и не более чем просто пул потоков.

И функция

void ServerManager::addWork(int sender, char *data){
    Work* work = new Work(sender, data);
    m_workHandler->addWork(work);
}

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

Кроме того, вы, ребята, думаете, что это хорошая идея с точки зрения дизайна сервера? Я читаю данные из буфера и не анализирую их, а просто передаю необработанные данные в пул потоков (вставляю в очередь). У пула потоков есть очередь, и пять отдельных потоков конкурируют, чтобы получить задание из очереди с блокировкой мьютекса и переменной условия. После завершения задания отдельный поток записывает результат в выходной буфер. Пожалуйста, дайте мне знать, если у него есть недостатки, и у вас, ребята, есть идея получше. Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 16 июня 2011

Единственный возможный недостаток, который я вижу сейчас, может быть внутри класса Work: убедитесь, что он создает свою собственную копию содержимого буфера непосредственно в конструкторе, поскольку он будет перезаписан при поступлении новых данных.Кроме этого, он должен работать как положено (трудно судить без выполнения конкретной работы и т. Д.).

Также не должно быть проблем с использованием массива, когда указатель на тип элементов массива имеет видтребуется, поскольку массив по сути является просто указателем (с точки зрения кода):

char data[1024];
char *pdata = data; // now data as well as pdata point to the first element
// data[0] is the same as using *(pdata + 0)
// data[1] is the same as using *(pdata + 1)

Если есть какое-либо предупреждение или ошибка компилятора, отправьте точное сообщение.Единственная реальная разница между обоими вариантами доступа к массивам заключается в том, что компилятор будет знать, что он получит указатель на весь массив вместо одного экземпляра при использовании char variable[] вместо char *variable.

0 голосов
/ 16 июня 2011

Можете ли вы просто избежать копирования? Если вы читаете данные в буферный класс, вы можете просто поставить в очередь экземпляр буфера и сразу же создать еще один для следующей партии данных. Нет копирования, и потоки пула всегда будут работать с данными, отличными от потока сервера, который читает данные из сокета. Конечно, вам нужно будет освободить объекты буфера (или перезапустить их) после того, как потоки пула обработают данные, но это небольшая цена за то, чтобы избежать копирования, конфликтов чтения / записи, синхронизации указателей буфера, синхронизированной между потоками и все эти неприятные вещи, которые очень трудно понять правильно.

Rgds, Martin

0 голосов
/ 16 июня 2011

Я думаю, что «несовместимые типы» должны быть только предупреждением.Если это ошибка, попробуйте преобразовать буфер в char *, когда вы передадите его функции.Но это быстрое и грязное решение. Возможно, вам следует подумать о более универсальном решении, которое не приводит к этой ошибке.

Разбор данных должен выполняться рабочим.Если вы позволите мастеру разобрать, это замедлит его.

...