gpt4 book ai didi

c++ - std::condition_variable::notify_all() - 我需要一个例子

转载 作者:行者123 更新时间:2023-11-30 01:07:49 26 4
gpt4 key购买 nike

我需要一个使用 notify_all() 方法的例子。因为我不明白它应该如何工作。

每个等待线程都以这样的代码开始:

std::unique_lock<std::mutex> lock(mutex);
condition_variable.wait(lock, [](){return SOMETHING;});

一开始,等待线程需要获取互斥量。因此,如果有多个等待线程,其余线程将等待锁定互斥量。那么,如果等待线程卡在锁定互斥体上并且根本不执行方法 wait(),那么使用 notify_all() 的目的是什么?这些线程将一个接一个地唤醒,而不是同时唤醒。

最佳答案

互斥体保护condition_variable 的内部状态。在 condition_variable 上调用 wait 会导致互斥体解锁。所以在等待时,线程不拥有互斥量。

wait 完成时,在调用 wait 返回之前再次(原子地)获取互斥量。

线程不争用互斥量,它们争用条件本身。

如果您愿意,您可以在等待结束后立即解锁。例如,如果你想允许多个线程在一个条件下同步,你可以这样做。您还可以使用此功能来实现信号量。

例子:

此代码以 10 个为一组处理事物。请注意 notify_all() unlock() 之后:

#include <condition_variable>
#include <mutex>
#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <vector>

void emit(std::string const& s)
{
static std::mutex m;
auto lock = std::unique_lock<std::mutex>(m);
std::cout << s << std::endl;
}

std::mutex m;
std::condition_variable cv;
int running_count = 0;

void do_something(int i)
{
using namespace std::literals;

auto lock = std::unique_lock<std::mutex>(m);
// mutex is now locked

cv.wait(lock, // until the cv is notified, the mutex is unlocked
[]
{
// mutex has been locked here
return running_count < 10;
// if this returns false, mutex will be unlocked again, but code waits inside wait() for a notify()
});
// mutex is locked here
++running_count;
lock.unlock();
// we are doing work after unlocking the mutex so others can also
// work when notified
emit("running " + std::to_string(i));
std::this_thread::sleep_for(500ms);
// manipulating the condition, we must lock
lock.lock();
--running_count;
lock.unlock();
// notify once we have unlocked - this is important to avoid a pessimisation.
cv.notify_all();
}

int main()
{
std::vector<std::thread> ts;
for (int i = 0 ; i < 200 ; ++i)
{
ts.emplace_back([i] { do_something(i); });
}

for (auto& t : ts) {
if (t.joinable()) t.join();
}

}

关于c++ - std::condition_variable::notify_all() - 我需要一个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43759609/

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