C 不完全是先进先出
我绞尽脑汁,但找不到解决办法。请考虑这种情况: 我有一些写入程序,它们想将非阻塞“队列”写入本地网络上的另一台机器,并且有一个读卡器,该读卡器将读取数据(如果没有写入程序,则为阻塞模式),并执行一些工作a,然后在长时间后返回并获取下一个数据 所以情况是这样的:C 不完全是先进先出,c,linux,unix,queue,fifo,C,Linux,Unix,Queue,Fifo,我绞尽脑汁,但找不到解决办法。请考虑这种情况: 我有一些写入程序,它们想将非阻塞“队列”写入本地网络上的另一台机器,并且有一个读卡器,该读卡器将读取数据(如果没有写入程序,则为阻塞模式),并执行一些工作a,然后在长时间后返回并获取下一个数据 所以情况是这样的: 作家写作 作家写作 作家写作 作家写作 作家写作 读者阅读并完成工作 在读卡器忙的同时: 作家写作 作家写作 作家写作 作家写作 作家写作 等等 我想我可以用一个tcp守护进程作为读卡器来实现这一点,但这意味着它将与fork(s)同时
- 作家写作
- 作家写作
- 作家写作
- 作家写作
- 作家写作
- 读者阅读并完成工作 在读卡器忙的同时:
- 作家写作
- 作家写作
- 作家写作
- 作家写作
- 作家写作
- 等等
有什么解决办法吗?这听起来好像你有一个解决方案。看看Wikipedia文章中的各种实现,看看它们是否满足您的需要。多线程似乎是应该遵循的路径。创建一个线程来启动读写部分,并在另一个任务上使用另一个线程。如果需要在读写器之间传递数据,则需要在线程之间提供一些线程安全通信。根据应用程序的上下文,您还可以考虑使用多个线程进行写入。
在POSIX系统上使用纯C时,pthreads是一个不错的选择。一个选项是使用服务器(writer)和客户机节点。 这概述了一般方法的基本原理: 服务器生成作业并将其推入本地队列:
// server thread
while(true)
{
job = generate();
jobs_queue.push(job); // push job to a local queue on the server
}
当客户端连接到服务器时,服务器上的线程读取队列中的所有内容并将其推送到客户端。当没有连接的客户端时,需要队列来保存作业。可能与你的情况无关
// server acceptor
while(true)
{
c = wait_for_connection();
while(connected(c))
{
while(queue.size() > 0)
c.write(queue.pop()); // send a job to the client
// block till queue is not empty. can be achieved with sleep or by using a mutex.
}
}
客户机节点将位于tcp套接字上,读取作业并将它们放入本地队列(在客户机上)。
有一个客户端线程的工作方式如下:
// client thread that poll from server
while(true)
{
job = readNextJob(); // tcp, blocks if there is nothing to read
queue.push(job);
}
// client thread that spawn jobs from queue
while(true)
{
job = queue.pop(); // blocks if queue empty
job.execute();
job.waitForCompletion();
}
我想我做不到。编写器是php+apache,因此没有线程……只是使用相同套接字编写了很多脚本。