如何将blocking-waitUntil()方法写入到使用std::atomics的池中
How to write a blockng waitUntil() method to a pool that uses std::atomics
我有一个验证类,它使用线程池来处理它的所有作业。
现在,当用户询问时,我启动一个线程,通过从磁盘读取来为我的验证类提供作业。我确信,在某一点上,阅读会比处理更快。所以我想写一个方法,如果处理的作业超过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);
}
};
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- C++ 11 您可以通过不同线程中的引用安全地传递和访问 std::atomics 吗?
- 如何将blocking-waitUntil()方法写入到使用std::atomics的池中
- 在c++11中使用带std::thread的atomics