сопрограммы и параллелизм в с ++ - PullRequest
0 голосов
/ 07 июля 2019

Мне кажется, что сопрограммы отлично подходят для локальных взаимодействий между вызывающим и вызываемым абонентом, но мне сложно понять, как они заменят волокна.Рассмотрим приведенный ниже пример: я хотел бы контролировать уровень параллелизма, чтобы сбалансировать задержку ввода-вывода моего процессора и диска, поэтому я порождаю несколько производителей и один потребительский.

Можно ли реализовать нечто подобное с помощью сопрограмм?Разве нам не нужен какой-то планировщик, чтобы можно было манипулировать между нашими асинхронными процессами?

using namespace boost;
void read_lines_fiber(const string& fname, fibers::buffered_channel<string>& chan) {
  my_fiber_file f(fname, 'r');  // fiber friendly, suspends on IO read.
  for (string s : f) {
     chan.push(std::move(s));
  }
}

void consume_lines(fibers::buffered_channel<string>& chan) {
  string line;
  while (true) {
    channel_op_status st = chan.pop(line);
    if (st == channel_op_status::closed)
      break;
    // ... use line....
  }
}

void orchestrator(const vector<string>& filenames) {
 fibers::buffered_channel<string> chan;
 fibers::fiber consumer(&consume_lines, std::ref(chan));
 std::vector<fibers::fiber> producer_handles; 

 // Launch all the producer fibers. 
 // We might want to limit number of concurrent fibers using fiber friendly semaphore.
 for (const auto& s : filenames) {
   producer_handles.emplace_back(&read_lines_fiber, std::ref(chan));
 }
 for (auto& fb : producer_handles) {
   fb.join();
 }
 chan.close();
 consumer.join();
}
...