我应该为我的应用程序使用进程或线程吗?

jac*_*des 3 c linux multithreading process

我有一台运行Linux 2.6内核的ARM设备,总内存为64 MB RAM.

有一个数据源,包括一个由Linux机箱查询的仪表,通过RS485和ModBus作为应用程序协议.

还有另一项任务,包括读取这些值并生成json对象,然后将HTTP POST发送到特定服务器.

网络操作可能比串行慢,尤其是在低GPRS覆盖范围内.

我需要并发,程序是用C语言编写的.

你会以哪种方式进行并发?使用select()还是使用pthreads?

msw*_*msw 5

在分析这个特定的应用程序时,实际上只有一个与选择pthreads相关的问题:

  1. 传感器读卡器和网络写入器是否需要共享地址空间?

在这种情况下,我认为答案显然是"不".当然,这不是唯一可能的问题,而是唯一的密切关系.有理由更喜欢单独的流程:

  1. 应用程序的两半没有共同的代码; RS485与HTTP/JSON完全不同
  2. 责任分离:如果RS485端正在等待UART,你真的想阻止HTTP端吗?
  3. 让操作系统完成它的工作所以你不必:如果使用pthreads,你必须处理内核为你免费提供的大量同步和抢占,你不必编写的代码没有新的错误.

进一步的分析需要比你给出的更多细节,但这是另一种思考选择的方法:发明线程是为了减轻过程模型的某些局限性.除非您知道要达到这些限制,否则请使用单独的流程.

添加回应评论:

我同意psusi建议的设计.只需要有两个进程,一个(让我们说传感器阅读器,这是一个很好的选择),它只分配一个http发送者.这两个进程可以使用传统的IPC(如管道)进行通信.当传感器有一些时,传感器进程会向下发送数据,而子进程(http)进程将其打包在json中并在其路上发送.

它只需要两个长期存在的进程,它可能使用与pthread实现相同数量的核心,并且它更容易实现.