在后台执行一个功能?我需要线程吗? C ++

时间:2013-09-18 16:22:54

标签: c++ linux queue tcpserver

我正在尝试自动化一些数据输入,所以我实现了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 ++中完成这项工作

还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

或者你可以有一个(单线程)event loop。你可以(痛苦地)在一些多路复用系统调用之上编写它,比如poll(2)

另请阅读Advanced Linux Programming

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

阅读C10Kclosures以及callbackscontinuation-passing style可能在某种程度上具有相关性,可以让您对潜在的问题和术语敞开心扉。请注意,C++11anonymous functions(即关闭)。