- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 Bjarne Stroustrup 的“C++ 编程语言,第 4 版”第 119 页中无意中发现了以下代码:
queue<Message> mqueue;
condition_variable mcond;
mutex mmutex;
void consumer()
{
while(true) {
unique_lock<mutex> lck{mmutex};
mcond.wait(lck);
auto m = mqueue.front();
mqueue.pop();
lck.unlock();
// process m
}
}
还有一个生产者线程将Message
插入队列,循环通知等待线程。
我的问题是:是否需要在循环的每次迭代中创建一个新的unique_lock
?这对我来说似乎是不必要的,因为在下一行 mcond.wait(lck)
中,锁在前一行锁定后直接解锁。
从性能的角度来看,lck
变量不能在循环开始之前初始化吗?
最佳答案
如前所述on cppreference ,std::unique_lock
构造函数是这样的:
explicit unique_lock( mutex_type& m );
构造函数将执行以下操作:
Constructs a unique_lock with m as the associated mutex. Additionally locks the associated mutex by calling m.lock(). The behavior is undefined if the current thread already owns the mutex except when the mutex is recursive.
所以代码在每次迭代时都会锁定互斥量。将其移出循环会改变逻辑。
关于c++ - 在消费者循环中重用 unique_lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45415874/
我在 Bjarne Stroustrup 的“C++ 编程语言,第 4 版”第 119 页中无意中发现了以下代码: queue mqueue; condition_variable mcond; mu
我不太清楚为什么 std::unique_lock比仅使用普通锁有用。我正在查看的代码示例是: {//aquire lock std::unique_lock lock(queue_m
请帮我看看我对 std::unique_lock 的理解移动语义是正确的。 假设我有一个函数 myFunc它需要在执行开始时获取互斥锁。 这个函数是从不同的函数调用的,其中一些函数例如myWrappe
我有一个应用程序,我使用 boost::shared_mutex 锁定在一个线程中编写一个 cv::Mat,然后从许多其他线程调用它。 这很好用,但是所有的读取都会减慢编写器的速度。我想这是因为写入正
Why would I use a unique_lock<> wrapper? 我有时会看到这样的代码 std::unique_lock lock(m_active_sessions_guard);
我遇到了一些关于 unique_lock 的奇怪行为。创建它之后,我尝试调用 unlock,但它使我的程序崩溃。我创建了一个最小的示例,该示例始终在解锁功能上崩溃(使用 gdb 进行确认)。 #inc
void Fn() { std::mutex* mutex = new std::mutex; std::unique_lock lock(*mutex); delete mutex; }
即使我手动调用了 unlock,unique_lock::unlock() 函数是否会在销毁时调用,以便在给定的互斥锁上接收到两次解锁信号? 最佳答案 不,它不会尝试解锁。如果你看unlock ,它
当开发人员在新范围内使用 std::unique_lock 自动解锁互斥量时,我看到了很多代码示例: ... // do some staff { std::unique_lock lock(sh
在使用类时,我试图更好地理解 std::mutex、std::lock_guard、std::unique_lock . 对于初学者来说,我知道 lock_guard 和 unique_lock 之间
我想在我的代码中使用线程,并认为即将到来的 C++0x 扩展会很方便,因为它们最终会成为一个标准。这似乎是面向 future 的,无需使用像 boost::thread 这样的额外库。 不幸的是,我找
我正在考虑使用以下代码: auto now = std::chrono::high_resolution_clock::now(); std::unique_lock lock(mutex, std:
我需要根据函数中的参数创建 unique_lock 或共享锁。我无法在功能范围内正确定义。所以我需要做这样的事情。 function (bool check) { lock; if (check)
在这个例子中,std::unique_lock 调用带有标志 std::defer_lock。在 cppreference 上写道:“defer_lock_t 不获取互斥体的所有权”和:“(析构函数)
我们使用的互斥锁有一个奇怪的接口(interface)(例如奇怪的外壳)。对 std::unique_lock 进行专门化将有助于减少使用此互斥锁的认知开销。 我在标准中找不到任何专门允许专门化 st
我正在使用 std::mutex 在函数的开头复制 std::shared_ptr。 // Lock the mutex unique_lock guard(d_mutex); // Copy a s
今天我在我们的代码中偶然发现了一个讨厌的错误: std::unique_lock (some_mutex); 注意缺少的标识符。我很惊讶这实际上编译并翻译成: std::unique_lock som
据我所知,std::unique_lock 是一种围绕底层 mutex 对象的包装器,以提供更安全使用原始 mutexes 实现(例如,如果抛出异常或销毁时,最终处于解锁状态)。这就是所有 std::
基于 C++ Equivalent to Java's BlockingQueue void push(T const& value) { // original version {
我在看this talk路易斯·布兰迪 (Louis Brandy),当一位观众提出这个显而易见的问题时: Why does std::unique_lock have a default const
我是一名优秀的程序员,十分优秀!