我有一台运行Linux 2.6内核的ARM设备,总内存为64 MB RAM。
有一个数据源,由Linux盒子通过RS485和ModBus作为应用协议查询的计量表组成。
另一个任务是读取这些值并制作一个JSON对象,然后HTTP POST到特定服务器。
网络操作可能比串行慢,特别是在低GPRS覆盖范围内。
我需要并发,程序是用C编写的。
你会选择哪种方式实现并发?使用select()还是使用pthreads?
我有一台运行Linux 2.6内核的ARM设备,总内存为64 MB RAM。
有一个数据源,由Linux盒子通过RS485和ModBus作为应用协议查询的计量表组成。
另一个任务是读取这些值并制作一个JSON对象,然后HTTP POST到特定服务器。
网络操作可能比串行慢,特别是在低GPRS覆盖范围内。
我需要并发,程序是用C编写的。
你会选择哪种方式实现并发?使用select()还是使用pthreads?
select()更有效率,因为它避免了多线程带来的上下文切换。而线程比单独的进程更有效率,因为您可以避免复制数据(除非您设置了共享内存,但此时您可能会转向使用线程)。然而,编写非阻塞I/O(例如select())更难且不容易正确实现,并且无法享受多线程带来的多任务处理。而多进程很可能是最容易实现的方式,特别是因为您可以使用curl而不必自己编写HTTP POST半部分。
为什么需要并发?是否必须在严格的时间间隔内轮询计量器?
如果答案是肯定的:只需使用两个进程,一个轮询计量器数据并将其写入NAND存储中的环形缓冲区,另一个从环形缓冲区读取数据并发送HTTP数据。
如果答案是否定的:您根本不需要并发和非阻塞。在main()中使用一个大循环就足够了。
fork()
让后台进程负责将其发送到Web服务器,而前台进程则返回读取串口。 - psusi