2011-06-16 16 views
2
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); 
} 

所以我需要一个字符指针,它指向我刚才读的数据。由于缓冲区被定义为一个数组,我将无法将其传递给函数。

另外,你们认为这是一个在服务器设计方面的好主意吗?我正在从缓冲区中读取数据,不解析它,只是将原始数据交给线程池(插入到队列中)。线程池有一个队列,五个单独的线程竞争使用互斥锁和条件变量从队列中获取作业。完成作业后,单独的线程会将结果写入输出缓冲区。请让我知道它是否有缺点,并且你们有更好的主意。提前致谢。

+0

你可能想要的数据尺寸加入该功能。 – DanDan 2011-06-16 10:57:05

回答

0

我现在看到的可能的缺陷可能在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

我认为“不兼容的类型”应该只是一个警告。 如果它是一个错误,然后尝试将缓冲区中的char *赋给函数。 但这是一个快速和肮脏的解决方案 也许你应该考虑一个更通用的解决方案,不会产生这个错误。

解析数据应该是工作者的工作。 如果你让主人解析它会减慢他的速度。

0

你可以避免复制吗?如果您将数据读入缓冲区类,则可以将缓冲区实例排队,并立即为下一批数据创建另一个数据。没有复制和池线程将始终在不同于从套接字读取的服务器线程的不同数据上工作。当然,在池线程处理完数据之后,你将不得不释放缓冲区对象(或者重新编译它们),但这是一个很小的代价,可以避免复制,读/写冲突,跨线程同步的缓冲区指针操作和所有那些难以理解的令人讨厌的东西。

RGDS, 马丁

相关问题