我写了一个用于模拟通信系统的代码。在这个通信系统中,有一个部分是我使用pthreads并行运行的。它基本上纠正了由通道引起的错误。
当我收到一个比特帧时,算法的3个分量在比特上运行。通常,它们一个接一个地运行,这样可以获得最佳性能,但是会有很大的延迟。
这个想法是让它们并行运行。但是为了获得最佳性能,3个组件可以同时处理每个位。
如果我只是并行运行它们会得到不好的结果,但速度非常快。所以我使用了障碍来同步进程,其中每个位由三个组件处理,然后允许它们跳转到下一位。
此方法的性能是最佳的。但代码运行速度非常慢,我的速度甚至比串行实现慢。
代码在Ubuntu上运行,带有GCC编译器。
编辑:还有一个问题,线程是否在等待屏障打开时进入睡眠状态?如果是这样,我该如何阻止他们这样做?答案 0 :(得分:2)
如果你真的必须在每个位之后进行同步,那么非常简单的线程不是一种合适的方法。同步开销将远远超过计算成本,因此最好在单个线程中完成。
你可以将工作分成更高的水平吗?例如,让整个帧由单个线程处理,但是并行处理多个帧?
答案 1 :(得分:1)
这是一个可能的解决方案,使用NO MUTEX。
假设您有4个线程:主线程读取一些输入,其他3个线程按块处理其块。一个线程可以在上一个完成处理之后处理一个块。
所以你有一个块的数据类型:
class chunk{
byte buffer[CHUNK_SIZE];
char status; // use char for atomic input, c++11 can use std::atomic_int.
public:
chunk():status(0);
};
你有一个块列表:
std::list<chunk> chunks;
所有线程在块上运行,直到它们到达列表的末尾,但等到状态达到一个条件,当输入块完成时,主线程将状态设置为1。第一个线程等待状态为1,表示输入完成,完成后设置状态为2,线程2等待状态为2表示线程1完成,处理完该块后,将状态设置为3,依此类推。最后,主线程等到状态为4才能得到结果
设置状态时很重要,使用=
而非++
使其尽可能原子化。