我有一台运行Linux 2.6内核的ARM设备,总内存为64 MB RAM。
有一个数据源,包括一个由Linux机箱查询的仪表,通过RS485和ModBus作为应用程序协议。
还有另一项任务,包括读取这些值并生成json对象,然后将HTTP POST发送到特定服务器。
网络操作可能比串行慢,尤其是在低GPRS覆盖范围内。
我需要并发,程序是用C语言编写的。
你会以哪种方式实现并发?使用select()或使用pthreads?
答案 0 :(得分:5)
在分析此特定应用程序时,实际上只有一个与选择pthreads相关的问题:
在这种情况下,我认为答案显然是“#34; no"”。当然,这不是唯一可能的问题,而是唯一的密切关系。有理由更喜欢单独的流程:
进一步的分析需要比你给出的更多细节,但这是另一种思考选择的方法:发明线程是为了减轻过程模型的某些局限性。除非您知道要达到这些限制,否则请使用单独的流程。
在回复评论时添加:
我同意psusi的建议设计。只需要有两个进程,一个(让我们说传感器阅读器,这是一个很好的选择),它只分配一个http发送者。这两个进程可以使用传统的IPC(如管道)进行通信。传感器进程在有一些数据时向下发送数据,子进程(http)进程将其打包在json中并在途中发送。
它只需要两个长期存在的进程,它可能使用与pthread实现相同数量的核心,并且更容易实现。
答案 1 :(得分:1)
select()更有效,因为它避免了多线程带来的上下文切换。并且线程比单独的进程更有效,因为您可以避免复制数据(除非您设置共享内存,但此时您可能已经使用了线程)。但是,像select()一样编写非阻塞I / O更难做到并且正确,并且不享受多线程带来的多任务处理。多个进程可能是最简单的实现,尤其是因为您可以使用curl而不是自己编写HTTP POST一半。
答案 2 :(得分:0)
为什么需要并发?是否必须在严格的时间间隔内对仪表进行轮询?
如果答案为是:只需使用两个进程,一个轮询仪表数据并写入nand存储器中的环形缓冲区,另一个从环形缓冲区读取数据并发送HTTP数据。
如果答案为否:您根本不需要并发和非阻塞。在main()中使用一个大循环就足够了。