我有一个问题要问。我有一个程序(进程1),它有三个线程:
还有另一个进程(进程2),它继续向进程1读取的本地套接字发送数据包。每秒发送的数据包数(大约100字节)可以高达每秒3000-5000个数据包。此设置在具有ARM v9控制器的嵌入式硬件上运行。
我必须确保没有丢失任何数据包,并且所有数据包都写入磁盘。在当前的实现中,我不时地从“sendto”(资源不可用)接收进程2的发送错误。
我禁用所有锁和互斥锁以避免竞争条件(删除所有检查以防止在读取时写入,反之亦然),即使这样我也会从“sendto”发送错误。
然后在第二步中,我禁用写入磁盘。现在,进程1的线程1可以从本地套接字读取尽可能快,并且没有发送错误。我的猜测是,由于线程在没有超线程的ARM控制器上运行,因此只有一个线程在单个时间点执行,并且OS正在处理线程的调度。
我的问题是,
是否可以并行运行三个线程(每个线程同时执行)?是否有gcc构造或编译器标志可以强制并行(在前台)运行线程?我是否可以在程序中更改某些内容以实现上述功能,而无需将功能拆分为多个程序并使用共享内存进行缓冲?
此致 阿努邦
答案 0 :(得分:0)
没有。你不能强制任何类型的线程顺序。那么你的第一个问题是,他们可以同时执行吗?是。你怎么能这样做?你不能。操作系统选择这样做。您可以设置优先级和类似的东西,但我仍然认为linux(或Windows)将随机切换线程,而不会告诉您/允许您更改调度程序。考虑一下计算机上运行的所有程序的所有线程;哪些可以执行,何时执行?答案是,谁知道!没有办法告诉你的线程什么时候会阻塞,即使它持有一个锁(这就是为什么你可能正在获得资源忙响应)。那你怎么阻止这种情况发生呢?在尝试使用资源之前,请确保检查资源是否仍处于锁定状态!然后,线程锁定资源时无关紧要。
另外,如果是IPC,你为什么要使用套接字?为什么不尝试管道,然后锁定它并不重要(除非一次有多个线程写入资源)。
答案 1 :(得分:0)
在这种情况下,Sender比Receiver更快,因此套接字上的NON_BLOCK选项可能导致发送错误(当发送者需要阻止时返回错误)。我有以下2条建议