История изменений
Исправление
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).