如何将阻塞 wait Until() 方法写入使用 std::atomics 的池
How to write a blockng waitUntil() method to a pool that uses std::atomics
我有一个验证 class,它使用线程池来处理它的所有作业。
现在,当用户询问时,我会启动一个线程,通过从磁盘读取作业来为我的验证 class 提供数据。而且我确信在某一时刻阅读会比处理更快。所以我想写一个方法,如果有超过,比如说,1000 个正在处理的作业,允许这个线程等待。
我已经介绍了一个原子,它在添加作业时增加,在完成作业时减少。
我添加方法的尝试并不完美。而且我知道一定可以使用更好的东西。
void Validator::waitUntilAvailable() {
while (m_blocksInFlight > 1000) { // thats my atomic
usleep(50000); // seems to be unavailable on Windows.
}
}
这里有谁能帮忙用非轮询的方法来解决我的问题吗?
谢谢。
有一个条件您想等待,但没有等待机制。
该机制是 std::condition_variable
和 std::mutex
。例如:
class Validator
{
std::mutex m_mutex;
std::condition_variable m_condition;
std::atomic<int> m_blocksInFlight{0};
bool test() const {
return m_blocksInFlight.load(std::memory_order_relaxed) > 1000;
}
void addJob() {
++m_blocksInFlight;
// Only lock the mutex when the test succeeds.
if(this->test()) {
std::unique_lock<decltype(m_mutex)> lock(m_mutex);
m_condition.notify_one();
}
}
void waitUntilAvailable() {
std::unique_lock<decltype(m_mutex)> lock(m_mutex);
while(!this->test())
m_condition.wait(lock);
}
};
我有一个验证 class,它使用线程池来处理它的所有作业。
现在,当用户询问时,我会启动一个线程,通过从磁盘读取作业来为我的验证 class 提供数据。而且我确信在某一时刻阅读会比处理更快。所以我想写一个方法,如果有超过,比如说,1000 个正在处理的作业,允许这个线程等待。
我已经介绍了一个原子,它在添加作业时增加,在完成作业时减少。
我添加方法的尝试并不完美。而且我知道一定可以使用更好的东西。
void Validator::waitUntilAvailable() {
while (m_blocksInFlight > 1000) { // thats my atomic
usleep(50000); // seems to be unavailable on Windows.
}
}
这里有谁能帮忙用非轮询的方法来解决我的问题吗?
谢谢。
有一个条件您想等待,但没有等待机制。
该机制是 std::condition_variable
和 std::mutex
。例如:
class Validator
{
std::mutex m_mutex;
std::condition_variable m_condition;
std::atomic<int> m_blocksInFlight{0};
bool test() const {
return m_blocksInFlight.load(std::memory_order_relaxed) > 1000;
}
void addJob() {
++m_blocksInFlight;
// Only lock the mutex when the test succeeds.
if(this->test()) {
std::unique_lock<decltype(m_mutex)> lock(m_mutex);
m_condition.notify_one();
}
}
void waitUntilAvailable() {
std::unique_lock<decltype(m_mutex)> lock(m_mutex);
while(!this->test())
m_condition.wait(lock);
}
};