- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是更多理论上的问题。我已经看到了std::condition_variable
的几个示例,似乎它使线程进入休眠状态,直到满足条件为止。这是比赛的标志,很有意义。
但是,似乎如果始终更改变量,则可能会唤醒线程以检查条件并再次进入休眠状态,因为当谓词为true时,它无法跟上情况,因此我可以将线程置于“昏迷状态” 。
那么,在我总是更改它的情况下使用std::condition_variable
是不安全的吗?
最佳答案
您似乎在谈论某种“活锁”。死锁是指一个或多个线程在等待释放锁时没有任何进展的情况。
Livelock相似,但是进程的状态在不断变化,但仍然没有进展。我们也可以谈论“实际上是活锁的”,其中线程没有足够的机会取得足够的进展。
对于观察者来说,活锁和实际的活锁通常看起来像真正的死锁。
您应设计程序逻辑以避免发生活锁。它可以是不平凡的。例如,许多形式的锁都不是“公平的”。那就是当多个线程正在等待释放的锁时,不能保证首先请求该锁的锁接下来会接收它。
实际上,许多操作系统锁本质上是不公平的,例如,将锁授予更容易唤醒(例如,加载到内核并挂起)而不是更难(从内核中卸载并需要重新加载以恢复执行)的线程。
这个问题没有提供很多细节,因此很难诊断出这种情况。
如果某个特定线程(或线程类)需要优先级,则可以引入一个标志,该标志告诉低优先级线程在优先级线程正在等待(并且可以运行)时不获取锁,例如(c && !(p && priority_waiting))
,其中c
是低优先级的逻辑条件。优先级线程和p
是优先级线程的逻辑条件。
当然,您应该避免在线程等待潜在 transient 条件的情况下使用逻辑。
假设您有一些监视线程,该线程每1000个周期产生一次输出。像(cycles%1000 == 0)
这样的等待条件很容易会错过计数器的点击。他们应该更喜欢(cycles-lcycles >=0)
之类的内容,其中lcycles
是监视器上次恢复处理后的周期数。这样可以确保为监视器通常提供一个锁(实际上是出于实用目的),它几乎永远不会挂住。
在该示例中,线程正在等待(a)获得锁定的机会和(b)某些暂时情况。存在这样的风险:这两种情况很少同时发生,线程可能被锁住或实际上被锁住,并且进度不足,
简而言之,要确保线程在条件通过时恢复,而不是在条件完全通过时恢复。
您可以引入严格的队列以使线程轮流。只是不要以为这就是您所拥有的,除非文档对公平做出明确的 promise 。
关于c++ - 我是否有在C++中使用std::condition_variable将线程置于死锁的风险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62675477/
此代码是实际项目代码的简化。主线程创建工作线程并使用 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
我是一名优秀的程序员,十分优秀!