gpt4 book ai didi

c - 在单核机器上运行 3 个并行线程

转载 作者:行者123 更新时间:2023-11-30 17:49:28 26 4
gpt4 key购买 nike

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

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

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

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

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

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

我的问题是,

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

问候,阿努潘

最佳答案

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

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

关于c - 在单核机器上运行 3 个并行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17818601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com