我正在尝试编写一个生产者、多个消费者管道,其中消费者在并行线程中运行。或者找到或分享一个简单的例子。使用Go 中相对简单的代码,输出清楚地显示了消费者并行工作。我认为它可能与 Boost 1.73 光纤类似,但我无法超越(不出所料)按顺序工作的代码:
#include <boost/fiber/buffered_channel.hpp>
#include <boost/fiber/fiber.hpp>
static void process(int item) {
std::cout << "consumer processing " << item << std::endl;
auto wasteOfTime = 0.;
for (auto s = 0.; s < item; s += 1e-7) {
wasteOfTime += sin(s);
}
if (wasteOfTime != 42) {
std::cout << "consumer processed " << item << std::endl;
}
}
static const std::uint32_t workers = 3;
int main() {
boost::fibers::buffered_channel<int> channel { 2 };
boost::fibers::fiber consumer[workers];
for (int i = 0; i < workers; ++i) {
consumer[i] = boost::fibers::fiber([&channel]() {
for (auto item : channel) {
process(item);
}
});
}
auto producer = boost::fibers::fiber([&channel]() {
std::cout << "producer starting" << std::endl;
channel.push(1);
channel.push(2);
channel.push(3);
channel.close();
std::cout << "producer ending" << std::endl;
});
producer.join();
for (int i = 0; i < workers; ++i) {
consumer[i].join();
}
return 0;
}
我尝试插入许多代码片段的变体来让工作线程调度纤程,但它们总是按顺序执行或根本不执行。来自关于逆问题的问题的代码似乎是朝着正确方向迈出的一步,虽然比 Go 复杂得多,但是(当使用 -DM_1_PI=3.14 编译时)该程序对我来说也只是闲置。