- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题是关于condition_variable.wait()
的功能。我认为它可能没有锁定 unique_lock
当它被通知时立即。让我展示一下我的代码,您会更好地理解我的测试。
注意:编译器 g++, std=c++14
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <atomic>
#include <future>
using namespace std;
mutex global_mut;
condition_variable global_cond;
atomic<bool> bval;
atomic<int> ival;
void accLock() {
unique_lock<mutex> lock(global_mut);
while (!bval.load()) {
global_cond.wait(lock);
}
cout << __PRETTY_FUNCTION__ << " get the lock" << endl;
ival.store(2, memory_order_release);
lock.unlock();
}
void getVal() {
lock_guard<mutex> lock(global_mut);
cout << __PRETTY_FUNCTION__ << " get the lock with " << ival.load(memory_order_acquire) << endl;
}
int main(int argc, char** argv) {
bval.store(false);
ival.store(0, memory_order_release);
// now my global_cond should be waiting for being notified
std::future<void> fut = std::async(std::launch::async, accLock);
// now my global_cond should be awaken and lock global_mut
bval.store(true);
global_cond.notify_one();
// getVal should be waiting for global_mut to be unlocked
getVal();
return 0;
}
理想情况下,我想要我的 accLock
线程首先锁定互斥量并更改 ival
, 这样 getVal() 就可以加载最新的 ival
,即 2。我希望看到类似这样的输出
void accLock() get the lock
void getVal() get the lock with 2
但实际上,这是
void getVal() get the lock with 0
void accLock() get the lock
显然,这个 unique_lock
没有“立即”锁定 global_cond
,让 lock_guard
在getVal()
首先获取互斥量。请问实现我想要的东西的正确方法是什么?我对 condition_variable
的理解正确吗? ?谢谢。
注意:我使用 memory_order_acl 和 release 是因为我认为这可以帮助我“更正”订单。但它不起作用。
最佳答案
当两个线程争用一个互斥锁时,哪个线程获得它是任意的。如果您希望一件事在另一件事发生之前发生,您有义务编写代码来实现它。互斥量不会强制执行任何特定的顺序。
如果您不希望 getVal
在另一个线程完成之前运行,您可以编写一些代码来等待它完成。您可以使用互斥量和条件变量来执行此操作,但您没有这样做。
一般来说,实现会根据您对其施加的限制尽可能地高效。停止调用 getVal
的线程效率低下(因为它的所有代码在缓存中都是热的并且已经被调度),所以实现没有这样做。
实现无法知道您想要什么,并且它低效地做事是没有意义的,希望这可能是您真正想要的但没有告诉它。
请注意,您在以后的运行中可能会得到不同的结果。准备运行的线程执行的顺序是不可预测的,除非您使其可预测。两个都线程已准备好运行,因此您不能指望任何特定的可靠顺序。这将是实现认为在这种情况下最好的。
关于c++ - condition_variable 获取锁速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57212319/
此代码是实际项目代码的简化。主线程创建工作线程并使用 std::condition_variable 等待工作线程真正启动。在下面的代码中,std::condition_variable 在 curr
reference I'm using用以下方式解释这两者: wait_for "阻塞当前线程,直到条件变量被唤醒或在指定的超时时间之后" wait_until "阻塞当前线程,直到条件变量被唤醒或到
标题问题的较长版本是: On my machine, sizeof(std::condition_variable) is 72 bytes.What are these 72 bytes used
假设我有这样的事情: bool signalled = false; std::condition_variable cv; void thread1() { while (true) {
我在下面的代码中遇到错误。 recursive_mutex m_RecurMutex; condition_variable cond; unique_lock lock(m_RecurMutex);
这是什么: bool ready; boost::mutex mutex; boost::condition_variable cond; boost::unique_lock lock(mutex)
这个问题是关于condition_variable.wait()的功能。我认为它可能没有锁定 unique_lock当它被通知时立即。让我展示一下我的代码,您会更好地理解我的测试。 注意:编译器 g+
我是条件变量的新手,我想知道为什么计数器变量等于 99 之后的这段代码块?删除for循环并改用“counter += 99”使代码工作,它与sleep_for有什么关系吗?感谢您的帮助:) #incl
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
似乎 condition_variable notify_one 并不总是按应有的方式工作。 struct Task { std::mutex mutex; std::conditio
条件变量可用于向其他线程发出信号,表明发生了某些事情: mutex m; condition_variable cv; thread t1([&cv]{ // processing .
没有 std::condition_variable 的应用程序: #include #include #include #include #include #include std::m
首先是我的代码,让我的解释更清楚: struct Foo { std::condition_variable cv; }; static Foo* foo; // dynamically cr
std::condition_variable::notify_one() 或 std::condition_variable::notify_all() 是否保证非原子内存写入当前线程之前该调用将在
我目前正在对并发队列进行编程,同时学习如何使用C++ 11的多线程功能。 当使用者调用dequeue()函数且队列中没有任何条目时,该函数应等待,直到另一个线程调用enqueue()为止。我正在为此使
我有一个关于notify_one函数的问题。在下面的代码中, #include #include #include #include #include std::condition_vari
我有一个以下类(class)- boost::condition_varaible cond_; 当我尝试编译时- [rmitra @ butterfly boost] $ make EXE = th
这是一个小代码段 request_ptr pop() { request_ptr rp; std::unique_lock lock(cv_mtx); auto time =
假设我有一个包含std::queue的ThreadQueue类,并且我将每个std::ref的实例传递给线程。进一步假设,线程1(主线程)创建并保存ThreadQueue对象,并将消息倒入其中,第二个
我有课,用 queue的 std::function成员和方法 Push和 Pop . 我要实现加法PushAndWaitUntilExecuted .当你有一个时很容易consumer-thread
我是一名优秀的程序员,十分优秀!