【问题标题】:Run 3 parallel threads in a single core machine在单核机器上运行 3 个并行线程
【发布时间】:2013-07-23 18:49:50
【问题描述】:

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

  1. 线程 1 连续运行,从锁套接字(AF_UNIX、NON_BLOCK)接收数据包并将它们复制到缓冲区。
  2. 线程 2 从缓冲区读取数据并将接收到的信息写入文件(磁盘)。
  3. 如果文件大于 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


【解决方案1】:

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

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

【讨论】:

  • 本地套接字实际上比管道更灵活(例如,双向发送和接收)。并且锁定在缓冲区而不是本地套接字上。我希望我已经把事情说清楚了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多