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>
49 void push(
void* v)
override
51 std::unique_lock<std::mutex>
lg(m_mutex);
52 m_shared_queue.push(v);
58 m_conditional_variable.notify_one();
62 std::unique_lock<std::mutex>
lg(m_mutex);
63 while (m_shared_queue.empty()) {
64 m_conditional_variable.wait(
lg);
66 void* v = m_shared_queue.front();
72 std::unique_lock<std::mutex>
lg(m_mutex);
73 if (m_shared_queue.empty())
75 void*
p = m_shared_queue.front();
82 std::queue<void*> m_shared_queue;
84 std::condition_variable m_conditional_variable;
90#ifdef ARCANE_HAS_PACKAGE_TBB
98 m_shared_queue.push(v);
104 while (!m_shared_queue.try_pop(v)) {
105 arcaneDoCPUPause(count);
114 m_shared_queue.try_pop(v);
120 tbb::concurrent_queue<void*> m_shared_queue;
127IAsyncQueue* IAsyncQueue::
133 [[maybe_unused]]
bool use_active_queue =
false;
134 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_USE_ACTIVE_SHM_QUEUE",
true))
135 use_active_queue = (v.value() != 0);
136 IAsyncQueue* queue =
nullptr;
137#ifdef ARCANE_HAS_PACKAGE_TBB
138 if (use_active_queue)
139 queue =
new TBBAsyncQueue();
142 queue =
new SharedMemoryBasicAsyncQueue();
Lecteur des fichiers de maillage via la bibliothèque LIMA.
File asynchrone permettant d'échanger des informations entre threads.
Implémentation basique d'une file multi-thread.
void push(void *v) override
Ajoute v dans la file.
void * tryPop() override
Récupère la première valeur s'il y en. Retourne nullptr sinon.
void * pop() override
Récupère la première valeur de la file et bloque s'il n'y en a pas.
Déclarations des types et méthodes utilisés par les mécanismes d'échange de messages.