Qrack  9.0
General classical-emulating-quantum development framework
dispatchqueue.hpp
Go to the documentation of this file.
1 //
3 // (C) Daniel Strano and the Qrack contributors 2017-2023. All rights reserved.
4 //
5 // This is a multithreaded, universal quantum register simulation, allowing
6 // (nonphysical) register cloning and direct measurement of probability and
7 // phase, to leverage what advantages classical emulation of qubits can have.
8 //
9 // Licensed under the GNU Lesser General Public License V3.
10 // See LICENSE.md in the project root or https://www.gnu.org/licenses/lgpl-3.0.en.html
11 // for details.
12 
13 // From https://github.com/embeddedartistry/embedded-resources/blob/master/examples/cpp/dispatch.cpp
14 
15 #pragma once
16 
17 #include "config.h"
18 
19 #if !ENABLE_PTHREAD || !ENABLE_QUNIT_CPU_PARALLEL
20 #error PTHREAD or QUNIT_CPU_PARALLEL has not been enabled
21 #endif
22 
23 #include <condition_variable>
24 #include <functional>
25 #include <future>
26 #include <mutex>
27 #include <queue>
28 
29 namespace Qrack {
30 
31 typedef std::function<void(void)> DispatchFn;
32 
34 public:
36  : quit_(false)
37  , isFinished_(true)
38  , isStarted_(false)
39  {
40  // Intentionally left blank.
41  }
43 
44  // dispatch and copy
45  void dispatch(const DispatchFn& op);
46  // finish queue
47  void finish();
48  // dump queue
49  void dump();
50  // check if queue is finished
51  bool isFinished() { return isFinished_; }
52 
53  // Deleted operations
54  DispatchQueue(const DispatchQueue& rhs) = delete;
55  DispatchQueue& operator=(const DispatchQueue& rhs) = delete;
56  DispatchQueue(DispatchQueue&& rhs) = delete;
58 
59 private:
60  std::mutex lock_;
61  std::future<void> thread_;
62  std::queue<DispatchFn> q_;
63  std::condition_variable cv_;
64  std::condition_variable cvFinished_;
65  bool quit_;
67  bool isStarted_;
68 
69  void dispatch_thread_handler(void);
70 };
71 
72 } // namespace Qrack
Definition: dispatchqueue.hpp:33
DispatchQueue & operator=(DispatchQueue &&rhs)=delete
std::mutex lock_
Definition: dispatchqueue.hpp:60
std::future< void > thread_
Definition: dispatchqueue.hpp:61
DispatchQueue & operator=(const DispatchQueue &rhs)=delete
void finish()
Definition: dispatchqueue.cpp:40
void dispatch(const DispatchFn &op)
Definition: dispatchqueue.cpp:66
void dump()
Definition: dispatchqueue.cpp:51
DispatchQueue()
Definition: dispatchqueue.hpp:35
std::condition_variable cv_
Definition: dispatchqueue.hpp:63
DispatchQueue(const DispatchQueue &rhs)=delete
void dispatch_thread_handler(void)
Definition: dispatchqueue.cpp:87
bool isFinished()
Definition: dispatchqueue.hpp:51
~DispatchQueue()
Definition: dispatchqueue.cpp:18
DispatchQueue(DispatchQueue &&rhs)=delete
std::queue< DispatchFn > q_
Definition: dispatchqueue.hpp:62
std::condition_variable cvFinished_
Definition: dispatchqueue.hpp:64
bool isStarted_
Definition: dispatchqueue.hpp:67
bool isFinished_
Definition: dispatchqueue.hpp:66
bool quit_
Definition: dispatchqueue.hpp:65
Definition: complex16x2simd.hpp:25
std::function< void(void)> DispatchFn
Definition: dispatchqueue.hpp:31