PicoScenes API Docs
 
Loading...
Searching...
No Matches
FIFOWaitBlocker.hxx
Go to the documentation of this file.
1//
2// Created by 蒋志平 on 2024/10/17.
3//
4
5#ifndef FIFOWAITBLOCKER_HXX
6#define FIFOWAITBLOCKER_HXX
7
8#include <condition_variable>
9#include <deque>
10#include <thread>
11#include <map>
12
14public:
15 static std::shared_ptr<FIFOWaitBlocker> getInstance(const std::string& instanceName) {
16 if (!instanceMap.contains(instanceName)) {
17 instanceMap[instanceName] = std::shared_ptr<FIFOWaitBlocker>(new FIFOWaitBlocker());
18 }
19
20 return instanceMap[instanceName];
21 }
22
24 std::lock_guard guard(queueMutex);
25 threadWaitQueue.emplace_back(std::this_thread::get_id());
26 }
27
28 [[nodiscard]] bool isThisThreadsTurn() {
29 std::lock_guard guard(queueMutex);
30 return !threadWaitQueue.empty() && threadWaitQueue.front() == std::this_thread::get_id();
31 }
32
33 void exit() {
34 auto id = std::this_thread::get_id();
35 std::lock_guard guard(queueMutex);
36 std::erase_if(threadWaitQueue, [id](const std::thread::id& currentId) {
37 return currentId == id;
38 });
39 }
40
41private:
42
43 std::mutex queueMutex;
44 std::deque<std::thread::id> threadWaitQueue;
45
46private:
47 static inline std::map<std::string, std::shared_ptr<FIFOWaitBlocker>> instanceMap{};
48 FIFOWaitBlocker() = default;
49};
50#endif //FIFOWAITBLOCKER_HXX
static std::shared_ptr< FIFOWaitBlocker > getInstance(const std::string &instanceName)