C 不完全是先进先出

C 不完全是先进先出,c,linux,unix,queue,fifo,C,Linux,Unix,Queue,Fifo,我绞尽脑汁,但找不到解决办法。请考虑这种情况: 我有一些写入程序,它们想将非阻塞“队列”写入本地网络上的另一台机器,并且有一个读卡器,该读卡器将读取数据(如果没有写入程序,则为阻塞模式),并执行一些工作a,然后在长时间后返回并获取下一个数据 所以情况是这样的: 作家写作 作家写作 作家写作 作家写作 作家写作 读者阅读并完成工作 在读卡器忙的同时: 作家写作 作家写作 作家写作 作家写作 作家写作 等等 我想我可以用一个tcp守护进程作为读卡器来实现这一点,但这意味着它将与fork(s)同时

我绞尽脑汁,但找不到解决办法。请考虑这种情况:

我有一些写入程序,它们想将非阻塞“队列”写入本地网络上的另一台机器,并且有一个读卡器,该读卡器将读取数据(如果没有写入程序,则为阻塞模式),并执行一些工作a,然后在长时间后返回并获取下一个数据

所以情况是这样的:

  • 作家写作
  • 作家写作
  • 作家写作
  • 作家写作
  • 作家写作
  • 读者阅读并完成工作

    在读卡器忙的同时:

  • 作家写作
  • 作家写作
  • 作家写作
  • 作家写作
  • 作家写作
  • 等等
我想我可以用一个tcp守护进程作为读卡器来实现这一点,但这意味着它将与fork(s)同时运行,我希望读卡器一次处理一个,因为它将完成一项cpu消耗量很大的工作

我曾考虑让tcp服务器获取请求,然后向FIFO发送信号,并让另一个守护进程从FIFO读取,但它也有相同的限制

我的意思是,当作者写作时,FIFO必须阅读,我希望作者的写作速度比读者快很多倍

db解决方案可以,但是A)速度不是很快,b)读卡器没有锁定..我不想用sleep实现它(x)它似乎不是一种好的编程技术


有什么解决办法吗?

这听起来好像你有一个解决方案。看看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,因此没有线程……只是使用相同套接字编写了很多脚本。