在单个核心机器中运行3个并行线程

时间:2013-07-23 18:49:51

标签: c multithreading parallel-processing pthreads arm

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

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

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

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

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

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

    我的问题是,

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

    此致 阿努邦

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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