0

我有一个问题要问。我有一个程序(进程 1),它有三个线程:

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

还有另一个进程(进程 2)不断向进程 1 读取的本地套接字发送数据包。每秒发送的数据包数(大约 100 字节)可高达每秒 3000-5000 个数据包。此设置在带有 ARM v9 控制器的嵌入式硬件上运行。

我必须确保没有任何数据包丢失并且所有数据包都写入磁盘。在当前的实现中,我时不时地从“sendto”(资源不可用)收到进程 2 的发送错误。

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

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

我的问题是,

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

问候, 阿努帕姆

4

2 回答 2

0

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

  1. 在 Sender (Process 2) 中,您可以重新发送导致发送错误的数据包。
  2. 移除套接字上的 NON_BLOCK 选项。
于 2013-08-02T09:30:33.057 回答
0

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

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

于 2013-07-23T20:17:58.773 回答