我的一个线程将数据写入循环缓冲区,另一个线程需要尽快处理这些数据。本来想写这么简单的spin
。伪代码!
while (true) {
while (!a[i]) {
/* do nothing - just keep checking over and over */
}
// process b[i]
i++;
if (i >= MAX_LENGTH) {
i = 0;
}
}
上面我a
用来表示存储的数据b
可用于处理。可能我还应该为这种“热”进程设置线程亲和力。当然,这种旋转在 CPU 方面非常昂贵,但对我来说没关系,因为我的主要要求是延迟。
问题是 - 我真的应该写这样的东西boost
还是stl
允许这样的东西:
- 更容易使用。
- 具有大致相同(甚至更好?)的延迟同时占用更少的 CPU 资源?
我认为我的模式非常普遍,应该在某个地方有一些好的实现。
upd看来我的问题还是太复杂了。让我们考虑一下当我需要以任意顺序将一些项目写入数组并且另一个线程应该在项目可用时以正确的顺序读取它们的情况,如何做到这一点?
更新2
我正在添加测试程序来演示我想要实现什么以及如何实现。至少在我的机器上它恰好可以工作。我rand
用来向您展示我不能使用一般queue
,我需要使用array-based
结构:
#include "stdafx.h"
#include <string>
#include <boost/thread.hpp>
#include "windows.h" // for Sleep
const int BUFFER_LENGTH = 10;
int buffer[BUFFER_LENGTH];
short flags[BUFFER_LENGTH];
void ProcessorThread() {
for (int i = 0; i < BUFFER_LENGTH; i++) {
while (flags[i] == 0);
printf("item %i received, value = %i\n", i, buffer[i]);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
memset(flags, 0, sizeof(flags));
boost::thread processor = boost::thread(&ProcessorThread);
for (int i = 0; i < BUFFER_LENGTH * 10; i++) {
int x = rand() % BUFFER_LENGTH;
buffer[x] = x;
flags[x] = 1;
Sleep(100);
}
processor.join();
return 0;
}
输出:
item 0 received, value = 0
item 1 received, value = 1
item 2 received, value = 2
item 3 received, value = 3
item 4 received, value = 4
item 5 received, value = 5
item 6 received, value = 6
item 7 received, value = 7
item 8 received, value = 8
item 9 received, value = 9
我的程序能保证工作吗?您将如何重新设计它,可能使用 boost/stl 中的一些现有结构而不是数组?是否可以在不影响延迟的情况下摆脱“旋转”?