C++ 在后台执行函数?我需要穿线吗?c++;
我正在尝试自动化一些数据输入,所以我实现了一个tcp客户端和服务器,客户端将发送文件名,然后服务器将进入一个共享文件夹并将该文件导入数据库 我的问题是,文件名的发送速度可能比“导入数据库”更快。因此,我创建了一个队列(我不知道如何设置它的大小),然后将文件名推送到队列上,然后执行C++ 在后台执行函数?我需要穿线吗?c++;,c++,linux,queue,tcpserver,C++,Linux,Queue,Tcpserver,我正在尝试自动化一些数据输入,所以我实现了一个tcp客户端和服务器,客户端将发送文件名,然后服务器将进入一个共享文件夹并将该文件导入数据库 我的问题是,文件名的发送速度可能比“导入数据库”更快。因此,我创建了一个队列(我不知道如何设置它的大小),然后将文件名推送到队列上,然后执行 PushToDatabase(filename); 我想做的是: queue<string> q; char *data = new char[1024]; ReadFromClient(data); /
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();
队列q;
字符*数据=新字符[1024];
ReadFromClient(数据);
//现在“数据”有了一个文件名
q、 推送(数据);
PushToDatabase(q.front());//我想在后台执行这个
q、 pop();
我不确定是否需要实现线程来实现这一点,我也不知道如何在c中实现这一点++
还有其他想法吗?你可以使用几个线程。对同步问题要非常小心 或者,您可以使用(单线程)。您可以(痛苦地)自己编写它,而不是像这样的多路复用系统调用 也请阅读 您还可以使用一些事件循环库,如or或Glib(来自GTK)或QtCore(来自Qt)或
阅读和可能会以某种方式相关,并可以打开您对潜在问题和术语的思路。请注意,有(即闭包)。您可以使用多个线程。对同步问题要非常小心 或者,您可以使用(单线程)。您可以(痛苦地)自己编写它,而不是像这样的多路复用系统调用 也请阅读 您还可以使用一些事件循环库,如or或Glib(来自GTK)或QtCore(来自Qt)或
阅读和可能会以某种方式相关,并可以打开您对潜在问题和术语的思路。请注意,有(即闭包)。根据正在处理的文件数量,您应该查看。您可以分配一个固定的大小,如果实现得当,您应该能够连续地读写它,而不会出现缓冲区过度/不足的问题。我认为boost有一个循环缓冲容器,您可以使用它,但是您需要有互斥体来确保它是同步的和线程安全的。这将确保您不会同时读取和写入相同的内存位置,也不会更改其他线程中的变量(因为线程使用共享内存空间)。您可以轮询环形缓冲区,查看是否有任何新数据要使用信号量进行处理,这也将消除上面概述的缓冲区过度/不足问题。您还应该看看std::atomic容器,它用于写入线程之间共享的变量,这样,如果两个线程试图写入同一个变量,就可以消除任何竞争条件 根据正在处理的文件数量,您应该查看。您可以分配一个固定的大小,如果实现得当,您应该能够连续地读写它,而不会出现缓冲区过度/不足的问题。我认为boost有一个循环缓冲容器,您可以使用它,但是您需要有互斥体来确保它是同步的和线程安全的。这将确保您不会同时读取和写入相同的内存位置,也不会更改其他线程中的变量(因为线程使用共享内存空间)。您可以轮询环形缓冲区,查看是否有任何新数据要使用信号量进行处理,这也将消除上面概述的缓冲区过度/不足问题。您还应该看看std::atomic容器,它用于写入线程之间共享的变量,这样,如果两个线程试图写入同一个变量,就可以消除任何竞争条件 感谢这些链接,我将开始探索它们,我知道fork()将分叉现有进程(整个程序),但它可以用来分叉一个函数到一个单独的进程吗?这是另一个问题,但是
fork
是分叉一个进程,不是,它不能用来分叉一个函数。。。因为它分叉了一个进程..感谢我开始探索这些链接,我知道fork()会分叉现有的进程(整个程序),但是它可以用来分叉一个函数到一个单独的进程吗?这是另一个问题,但是是fork
是分叉一个进程,不是,它不能用来分叉一个函数。。。因为这是一个过程。。