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
13
class
FIFOWaitBlocker
{
14
public
:
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
23
void
joinFIFOWaitQueue
() {
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
41
private
:
42
43
std::mutex queueMutex;
44
std::deque<std::thread::id> threadWaitQueue;
45
46
private
:
47
static
inline
std::map<std::string, std::shared_ptr<FIFOWaitBlocker>> instanceMap{};
48
FIFOWaitBlocker
() =
default
;
49
};
50
#endif
//FIFOWAITBLOCKER_HXX
FIFOWaitBlocker
Definition
FIFOWaitBlocker.hxx:13
FIFOWaitBlocker::exit
void exit()
Definition
FIFOWaitBlocker.hxx:33
FIFOWaitBlocker::getInstance
static std::shared_ptr< FIFOWaitBlocker > getInstance(const std::string &instanceName)
Definition
FIFOWaitBlocker.hxx:15
FIFOWaitBlocker::joinFIFOWaitQueue
void joinFIFOWaitQueue()
Definition
FIFOWaitBlocker.hxx:23
FIFOWaitBlocker::isThisThreadsTurn
bool isThisThreadsTurn()
Definition
FIFOWaitBlocker.hxx:28
headers
FIFOWaitBlocker.hxx
Generated by
1.9.8