我有个问题要问。我有一个程序(处理过程1),其具有三个线程:在单核机器上运行3个并行线程
- 线程1点连续运行,从锁定插座(AF_UNIX,NON_BLOCK),并将它们复制到缓冲接收分组。
- 线程2从缓冲区读取数据,并将接收到的信息写入文件(磁盘)。
- 线程3压缩文件,如果文件增长大于5 MB
还有另一种方法(方法2),其被连续地发送分组到由方法1的报文数读出的本地套接字(的周围每秒发送100个字节)可以高达每秒3000-5000个数据包。该设置在带ARM v9控制器的嵌入式硬件上运行。
我必须确保没有任何数据包丢失,并且所有数据包都写入磁盘。在目前的实施中,我会收到来自“sendto”(资源不可用)的流程2中的错误。
我禁用了所有的锁和互斥体以避免竞争条件(取消所有检查以防止在读取时写入,反之亦然),即使这样我发送错误从“sendto”。
然后在第二步中,我禁用写入磁盘。现在,进程1的线程1可以从本地套接字读取尽可能快的速度,并且没有发送错误。我的猜测是,由于线程在没有超线程的ARM控制器上运行,因此只有一个线程在单个时间点执行,操作系统正在处理线程调度。
我的问题在这里,
是否有可能运行三个线程并行(他们每个人的同时执行)?是否有一个gcc结构或编译器标志可以强制并行运行线程(在前台)?我可以在程序中更改某些内容以实现上述功能,而不必将功能拆分为多个程序并使用共享内存作为缓冲区?
问候, 阿努邦
是异步I/O选项吗?您可能正在等待磁盘,直到网络缓冲区填满,以异步方式写入文件可能有助于尽可能降低缓冲区。 –
不幸的是,我还测试了大小为50 MB的缓冲区,并且在发送错误开始时缓冲区甚至没有满。 – anupash