0

我正在尝试自动化一些数据输入,所以我实现了一个 tcp 客户端和服务器,客户端将发送文件名,然后服务器将进入共享文件夹并将该文件导入数据库。

我的问题是文件名的发送速度可能比“导入数据库”更快。所以我创建了一个队列(我不确定如何设置它的大小),然后我将文件名推送到队列上然后执行

PushToDatabase(filename);

我想做的是:

queue<string> q;
char *data = new char[1024];
ReadFromClient(data);
//now 'data' has a filename
q.push(data);
PushToDatabase(q.front());  // I want to execute this in the background
q.pop();

我不确定是否需要实现线程来完成这项工作我也不知道如何在 c++ 中完成

还有其他想法吗??

4

2 回答 2

2

根据您正在处理的文件数量,您应该查看环形缓冲区. 如果实施得当,您可以分配固定大小,并且应该能够连续读取和写入它而不会出现缓冲区溢出/不足的问题。我认为 boost 有一个你可以使用的循环缓冲区容器,但你需要有互斥锁以确保它是同步的和线程安全的。这将确保您不会同时读取和写入相同的内存位置或更改其他线程中的变量(因为线程使用共享内存空间)。您可以轮询环形缓冲区以查看是否有任何新数据要使用信号量进行处理,这也将消除上述缓冲区过度/不足的问题。您还应该查看用于编写将在线程之间共享的变量的 std::atomic 容器,这样如果两个线程尝试写入同一个变量,您就可以消除任何竞争条件。

于 2013-09-18T17:36:59.760 回答
1

您可以使用多个线程。对同步问题要非常小心。

或者,您可以有一个(单线程)事件循环您可以(痛苦地)在诸如poll(2)之类的多路复用系统调用之上自己编写它。

另请阅读高级 Linux 编程

您还可以使用一些事件循环库,例如libeventlibev或 Glib(来自 GTK)或 QtCore(来自 Qt)或libsigc++

阅读有关C10K闭包回调延续传递风格的内容可能在某种程度上是相关的,并且可以让您对潜在的问题和术语有所了解。请注意,C++11具有匿名函数(即闭包)。

于 2013-09-18T17:22:09.180 回答