14#include "arcane/parallel/thread/IAsyncQueue.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/ValueConvert.h"
19#include "arcane/parallel/thread/ArcaneThreadMisc.h"
23#include <condition_variable>
25#include "arcane_packages.h"
27#ifdef ARCANE_HAS_PACKAGE_TBB
28#include <tbb/concurrent_queue.h>
50 void push(
void* v)
override
52 std::unique_lock<std::mutex> lg(m_mutex);
53 m_shared_queue.push(v);
59 m_conditional_variable.notify_one();
63 std::unique_lock<std::mutex> lg(m_mutex);
64 while (m_shared_queue.empty()) {
65 m_conditional_variable.wait(lg);
67 void* v = m_shared_queue.front();
73 std::unique_lock<std::mutex> lg(m_mutex);
74 if (m_shared_queue.empty())
76 void* p = m_shared_queue.front();
83 std::queue<void*> m_shared_queue;
85 std::condition_variable m_conditional_variable;
91#ifdef ARCANE_HAS_PACKAGE_TBB
99 m_shared_queue.
push(v);
105 while (!m_shared_queue.try_pop(v)) {
106 arcaneDoCPUPause(count);
115 m_shared_queue.try_pop(v);
121 tbb::concurrent_queue<void*> m_shared_queue;
134 [[maybe_unused]]
bool use_active_queue =
false;
136 use_active_queue = (v.value() != 0);
137 IAsyncQueue* queue =
nullptr;
138#ifdef ARCANE_HAS_PACKAGE_TBB
139 if (use_active_queue)
140 queue =
new TBBAsyncQueue();
143 queue =
new SharedMemoryBasicAsyncQueue();
static std::optional< Int32 > tryParseFromEnvironment(StringView s, bool throw_if_invalid)
Asynchronous queue allowing the exchange of information between threads.
virtual void push(void *v)=0
Adds v to the queue.
Basic implementation of a multi-threaded queue.
void push(void *v) override
Adds v to the queue.
void * tryPop() override
Retrieves the first value if available. Returns nullptr otherwise.
void * pop() override
Retrieves the first value from the queue and blocks if there are none.
Declarations of types and methods used by message exchange mechanisms.