【发布时间】:2013-07-23 18:49:50
【问题描述】:
我有一个问题要问。我有一个程序(进程 1),它有三个线程:
- 线程 1 连续运行,从锁套接字(AF_UNIX、NON_BLOCK)接收数据包并将它们复制到缓冲区。
- 线程 2 从缓冲区读取数据并将接收到的信息写入文件(磁盘)。
- 如果文件大于 5 MB,线程 3 会压缩文件
还有另一个进程(进程 2)不断向进程 1 读取的本地套接字发送数据包。每秒发送的数据包数(大约 100 字节)可高达每秒 3000-5000 个数据包。此设置在带有 ARM v9 控制器的嵌入式硬件上运行。
我必须确保没有任何数据包丢失并且所有数据包都写入磁盘。在当前的实现中,我时不时地在进程 2 中收到来自“sendto”(资源不可用)的发送错误。
我禁用所有锁和互斥锁以避免竞争条件(删除所有检查以防止读取时写入,反之亦然),即使这样我也收到来自“sendto”的发送错误。
然后在第二步中,我禁用写入磁盘。现在,进程 1 的线程 1 可以尽可能快地从本地套接字读取,并且没有发送错误。我的猜测是,由于线程在没有超线程的 ARM 控制器上运行,因此在单个时间点只有一个线程在执行,并且操作系统正在处理线程的调度。
我的问题是,
是否可以并行运行三个线程(每个线程同时执行)?是否有 gcc 构造或编译器标志可以强制线程并行运行(在前台)?我可以在程序中更改某些内容以实现上述目的,而无需将功能拆分为多个程序并使用共享内存作为缓冲区吗?
问候, 阿努潘
【问题讨论】:
-
可以选择异步 I/O 吗?您可能正在等待磁盘,直到网络缓冲区填满,异步写入文件可能有助于保持缓冲区尽可能低。
-
不幸的是,我还测试了大约 50 MB 的巨大缓冲区,当发送错误开始时,缓冲区甚至没有半满。
标签: c multithreading parallel-processing pthreads arm