rigtorp / MPMCQueue

A bounded multi-producer multi-consumer concurrent queue written in C++11
MIT License
1.15k stars 159 forks source link

Update README with more precise description of the queue behavior #41

Open frankist opened 9 months ago

frankist commented 9 months ago

I am opening this issue because I found that the README didn't explain with precision the behavior that is expected from the MPMC queue.

In the README, one can read the following:

bool try_push(const T &v);

Try to enqueue an item using copy construction. Returns true on success and false if queue is full.

However, if I run the following test, it fails:

TEST(mpmc_queue_test, push_after_pop_should_not_fail)
{
  rigtorp::MPMCQueue<int> q(256);
  for (int i = 0; i != 256; ++i) {
    ASSERT_TRUE(q.try_push(i));
  }
  std::atomic<bool> running{true};

  auto task = [&q, &running]() {
    while (running) {
      int v;
      if (q.try_pop(v)) {
        ASSERT_TRUE(q.try_push(v));
      }
    }
  };

  std::thread t1{task};
  std::thread t2{task};
  std::thread t3{task};
  std::thread t4{task};

  std::this_thread::sleep_for(std::chrono::seconds{5});
  running = false;
  t1.join();
  t2.join();
  t3.join();
  t4.join();
}

Notice that the try_push inside the lambda is always going to push to a queue that is never full. This is guaranteed via the try_pop just one line above. If there can be spurious failures when multiple writers call try_push concurrently, then this should be clear in the function description in the README.