LINUX.ORG.RU

История изменений

Исправление kvpfs, (текущая версия) :

Теоретически конечно потоки 2 и 3 должны только читать память из потока 1 (хотя что происходит внутри сторонней либы потока 2 я не знаю)

Можно проверить наверняка - скорми в свою либу данные, которые находятся в read only памяти, условно:

const int i = 3;

int main() {
        int *a = const_cast<int*>(&i);
        *a = 8; // segfault
}

если сегфолтнится, значит модифицирует.

По организации очереди - ну навскидку, если задачу понял, то мне с дивана кажется годным:

class Queue {
   vector<shared_ptr> data;
   int decode_send_to_net_pos;
   int write_to_disk_pos;
public:
   void insert_frame(shared_ptr in) {
      temp_shared_ptr_buf;
      {
         get_unique_lock;
         data.push_back(in);
         // move range [ 0, min(write_pos, send_pos) )
         // to temp_shared_ptr_buf, adjust pos
      }
      // delete temp_shared_ptr_buf;
   }
   shared_ptr next_frame_for_decode() {
      get_shared_lock;
      return data[decode_send_to_net_pos++];
   }
   shared_ptr next_frame_for_disk();
}

Благодаря шаред_птр заюзан вектор, значит быстрый, произвольный доступ без инвалидации при вставке. Также длительность блокировок должна быть небольшой, накостылить spin lock может быть вполне норм (тест покажет что будет лучше - shared_mutex или spin lock).

Исходная версия kvpfs, :

Теоретически конечно потоки 2 и 3 должны только читать память из потока 1 (хотя что происходит внутри сторонней либы потока 2 я не знаю)

Можно проверить наверняка - скорми в свою либо данные, которые находятся в read only памяти, условно:

const int i = 3;

int main() {
        int *a = const_cast<int*>(&i);
        *a = 8; // segfault
}

если сегфолтнится, значит модифицирует.

По организации очереди - ну навскидку, если задачу понял, то мне с дивана кажется годным:

class Queue {
   vector<shared_ptr> data;
   int decode_send_to_net_pos;
   int write_to_disk_pos;
public:
   void insert_frame(shared_ptr in) {
      temp_shared_ptr_buf;
      {
         get_unique_lock;
         data.push_back(in);
         // move range [ 0, min(write_pos, send_pos) )
         // to temp_shared_ptr_buf, adjust pos
      }
      // delete temp_shared_ptr_buf;
   }
   shared_ptr next_frame_for_decode() {
      get_shared_lock;
      return data[decode_send_to_net_pos++];
   }
   shared_ptr next_frame_for_disk();
}

Благодаря шаред_птр заюзан вектор, значит быстрый, произвольный доступ без инвалидации при вставке. Также длительность блокировок должна быть небольшой, накостылить spin lock может быть вполне норм (тест покажет что будет лучше - shared_mutex или spin lock).