Привет, я планировал использовать очередь Boost SPSC. У меня должен быть прослушиватель, который всегда прослушивает входящие сообщения, как только он получит, он поместит сообщение в очередь и вернется, чтобы снова дождаться новых сообщений. И есть потребитель, который выталкивает сообщения из очереди и обрабатывает их.
Поскольку я не хочу, чтобы мой слушатель ждал, пока блокировка запишется в очередь, я предпочел boost_lockfree_spsc_queue
. И я полагал, что размер очереди изменится, если я установлю fixed_sized<false>
при инициализации очереди. Но кажется, что это не так.
Ниже приведен мой код:
boost::lockfree::spsc_queue<int, boost::lockfree::fixed_sized<false>> lockFreeQ{10};
void sharedQueue::lockFreeProduce()
{
for(int i = 0; i < 100; i++)
{
lockFreeQ.push(i);
cout<<"--"<<i<<endl;
}
}
void sharedQueue::lockFreeConsume(){
for(int i = 0; i <100; i++){
/* Implement a blocking pop to the queue in order to waste cpu time by busy waiting*/
while(!(lockFreeQ.read_available() > 0))
{
//std::this_thread::yield();
std::this_thread::sleep_for(std::chrono::nanoseconds(10));
}
cout<<" ***"<<lockFreeQ.front()<<endl;
lockFreeQ.pop();
}
}
void sharedQueue:: TestLockFreeQueue()
{
std::thread t1([this]() { this->lockFreeProduce(); });
std::thread t2([this]() { this->lockFreeConsume(); });
t1.join();
t2.join();
}
Вывод показывает, что потеря данных. Ниже приводится частичный результат. но, например, он пропускает номер 87 ,92.
**85
***86
***88
***90
***91
***93
***95
***96
***98
Если бы он был переменного размера, он должен был бы увеличить размер очереди и не потерять данные. Кажется, что он перезаписывает данные, как объяснено Следствием циклического буфера является то, что когда он заполнен и последующий запись выполняется, затем она начинает перезаписывать самые старые данные.. В таком случае, как с этим справиться без потери данных?
Спасибо