2013-07-23 26 views
0

我有个问题要问。我有一个程序(处理过程1),其具有三个线程:在单核机器上运行3个并行线程

  1. 线程1点连续运行,从锁定插座(AF_UNIX,NON_BLOCK),并将它们复制到缓冲接收分组。
  2. 线程2从缓冲区读取数据,并将接收到的信息写入文件(磁盘)。
  3. 线程3压缩文件,如果文件增长大于5 MB

还有另一种方法(方法2),其被连续地发送分组到由方法1的报文数读出的本地套接字(的周围每秒发送100个字节)可以高达每秒3000-5000个数据包。该设置在带ARM v9控制器的嵌入式硬件上运行。

我必须确保没有任何数据包丢失,并且所有数据包都写入磁盘。在目前的实施中,我会收到来自“sendto”(资源不可用)的流程2中的错误。

我禁用了所有的锁和互斥体以避免竞争条件(取消所有检查以防止在读取时写入,反之亦然),即使这样我发送错误从“sendto”。

然后在第二步中,我禁用写入磁盘。现在,进程1的线程1可以从本地套接字读取尽可能快的速度,并且没有发送错误。我的猜测是,由于线程在没有超线程的ARM控制器上运行,因此只有一个线程在单个时间点执行,操作系统正在处理线程调度。

我的问题在这里,

是否有可能运行三个线程并行(他们每个人的同时执行)?是否有一个gcc结构或编译器标志可以强制并行运行线程(在前台)?我可以在程序中更改某些内容以实现上述功能,而不必将功能拆分为多个程序并使用共享内存作为缓冲区?

问候, 阿努邦

+0

是异步I/O选项吗?您可能正在等待磁盘,直到网络缓冲区填满,以异步方式写入文件可能有助于尽可能降低缓冲区。 –

+0

不幸的是,我还测试了大小为50 MB的缓冲区,并且在发送错误开始时缓冲区甚至没有满。 – anupash

回答

0

号你不能强迫任何线程秩序。所以你的第一个问题是,它们可以同时执行吗?是。你怎么能这样做?你不能。操作系统选择这样做。你可以设置优先级和类似的东西,但我仍然认为linux(或windows)会非常随机地切换线程,而不会告诉你/允许你改变调度器。考虑计算机上运行的所有程序中的所有线程;哪些可以执行以及何时执行?答案是,谁知道!没有办法知道你的线程什么时候会阻塞,即使它持有一个锁(这就是为什么你可能会得到一个资源忙的响应)。那么你如何阻止这种情况发生?确保在尝试使用资源之前检查资源是否仍处于锁定状态!然后,线程锁定资源时无关紧要。

另外,如果它的IPC,为什么你使用套接字?为什么不尝试一个管道,然后锁定它并没有关系(除非一次有多个线程写入资源)。

+0

本地套接字实际上比管道更灵活(例如发送和接收两种方式)。 锁定在缓冲区中,而不是在本地套接字上。 我希望我已经说清楚了。 – anupash

0

在这种情况下,发送方比接收方更快,因此套接字上的NON_BLOCK选项可能会导致发送错误(发送方需要阻止时返回错误)。我有以下2条建议

  1. 在发送方(进程2)中,您可以重新发送导致发送错误的数据包。
  2. 删除套接字上的NON_BLOCK选项。