25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

38 satır
885 B

  1. #include <ecs/core/utils/fixed_function.inl>
  2. #include <ecs/core/utils/thread_pool/task_queue.inl>
  3. using namespace ::ecs::core::utils;
  4. concurrent_task_queue
  5. ::concurrent_task_queue()
  6. : _count (0)
  7. , _inner_queue ()
  8. { }
  9. void concurrent_task_queue
  10. ::push(task&& t)
  11. {
  12. if (!_inner_queue.enqueue(std::move(t)))
  13. {
  14. throw std::overflow_error("task queue is out of memory");
  15. }
  16. _count++;
  17. }
  18. bool concurrent_task_queue
  19. ::pop(task& t)
  20. {
  21. ssize_t old_count = _count.load(std::memory_order_relaxed);
  22. while (old_count > 0)
  23. {
  24. if (_count.compare_exchange_weak(old_count, old_count - 1, std::memory_order_acquire, std::memory_order_relaxed))
  25. {
  26. while (!_inner_queue.try_dequeue(t))
  27. {
  28. continue;
  29. }
  30. return true;
  31. }
  32. }
  33. return false;
  34. }