Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在后台执行函数?我需要穿线吗?c++;_C++_Linux_Queue_Tcpserver - Fatal编程技术网

C++ 在后台执行函数?我需要穿线吗?c++;

C++ 在后台执行函数?我需要穿线吗?c++;,c++,linux,queue,tcpserver,C++,Linux,Queue,Tcpserver,我正在尝试自动化一些数据输入,所以我实现了一个tcp客户端和服务器,客户端将发送文件名,然后服务器将进入一个共享文件夹并将该文件导入数据库 我的问题是,文件名的发送速度可能比“导入数据库”更快。因此,我创建了一个队列(我不知道如何设置它的大小),然后将文件名推送到队列上,然后执行 PushToDatabase(filename); 我想做的是: queue<string> q; char *data = new char[1024]; ReadFromClient(data); /

我正在尝试自动化一些数据输入,所以我实现了一个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();
队列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
是分叉一个进程,不是,它不能用来分叉一个函数。。。因为这是一个过程。。