gpt4 book ai didi

c++ - 如何将 std::condition_variable 与我自己的互斥体包装器一起使用

转载 作者:行者123 更新时间:2023-12-04 07:54:16 24 4
gpt4 key购买 nike

我想演示/记录一些 std::mutex行为。我想记录对 lock() 的每个调用和 unlock() (无论他们成功还是必须阻止)。最初,由于那些方法不是 virtual ,我试图包装标准std::mutex通过以下方式,而不是使用继承:

struct mutex_wrapper {
std::mutex mut = std::mutex();

void lock() {
std::cout << "LOCKING MUTEX\n";
mut.lock();
}

void unlock() {
std::cout << "UNLOCKING MUTEX\n";
mut.unlock();
}
};
忽略调用 std::cout << 的事实在多个线程中调用时可能会产生损坏的输出。
然后我想检查一个简单的 std::condition_variable 的输出。例如:
int main() {
auto ready = false;
auto mutex = mutex_wrapper();
auto cvar = std::condition_variable();

auto t = std::thread([&mutex, &cvar, &ready] {
std::unique_lock lock(mutex);
cvar.wait(lock, [&ready] { return ready; });
std::cout << "woke up\n";
});

std::this_thread::sleep_for(std::chrono::seconds(2));
{
std::lock_guard lock(mutex);
ready = true;
}
std::cout << "notifying\n";
cvar.notify_one();

t.join();
}
问题是它不能编译,因为很明显, wait()要求对应的 std::unique_lock用常规 std::mutex 实例化当我尝试将它与我自己的 mutex_wrapper 一起使用时.
有没有办法记录标准互斥锁的锁定和解锁的内部使用情况?或者有没有办法制作 std::condition_variable使用包装器?

最佳答案

std::condition_variable仅适用于 std::unique_lock<std::mutex> -- 所以你可能想要使用 std::condition_variable_any .这是 std::condition_variable 的概括可以与任何 BasicLockable 一起使用类型,例如您的互斥体包装器。
请注意,使用 std::condition_variable 可能有点悲观。/std::mutex直接因为通常这些在实现中紧密耦合以获得更好的性能。但是,既然您无论如何都在这里登录,我怀疑这总体上不会是一个太大的问题。
另一种方法是编写自己的自定义 condition_variable直接根据您的包装 mutex 操作的包装器类型和底层证券std::condition_variable -- 并提取 std::mutex锁定时直接。

关于c++ - 如何将 std::condition_variable 与我自己的互斥体包装器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66783854/

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