gpt4 book ai didi

c++ - 如何将 blockng waitUntil() 方法写入使用 std::atomics 的池

转载 作者:行者123 更新时间:2023-11-30 05:17:12 25 4
gpt4 key购买 nike

我有一个验证类,它使用线程池来处理它的所有作业。

现在,当用户询问时,我会启动一个线程,通过从磁盘读取作业来为我的验证类提供作业。而且我确信在某一时刻阅读会比处理更快。因此,我想编写一个方法,允许该线程在处理的作业超过(例如)1000 个时等待。

我已经介绍了一个原子,它在添加作业时增加,在作业完成时减少。

我添加方法的尝试并不完美。而且我知道一定有可能使用更好的东西。

void Validator::waitUntilAvailable() {
while (m_blocksInFlight > 1000) { // thats my atomic
usleep(50000); // seems to be unavailable on Windows.
}
}

这里有谁能帮忙用非轮询的方法来解决我的问题吗?

谢谢。

最佳答案

有一个条件你想等待,但没有等待机制。

该机制是 std::condition_variablestd::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);
}
};

关于c++ - 如何将 blockng waitUntil() 方法写入使用 std::atomics 的池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42225430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com