在下面的选项中,使用条件变量时是否有正确的方法来处理虚假唤醒?
1)使用布尔值将wait(unique_lock_ul)放入无限循环while
unique_lock<mutex> ul(m);
while(!full)
cv.wait(ul);
Run Code Online (Sandbox Code Playgroud)
2) 与 if 相同
unique_lock<mutex> ul(m);
if(!full)
cv.wait(ul);
Run Code Online (Sandbox Code Playgroud)
3) 在 中放置一个条件wait(),例如使用 lambda 函数
unique_lock<mutex> ul(m);
cv.wait(ul, [&](){return !full;});
Run Code Online (Sandbox Code Playgroud)
如果这些都不正确,那么如何轻松处理虚假唤醒呢?
我对 C++ 中的条件变量相当陌生,我不确定我读到的一些代码是否处理虚假唤醒的情况。
我正在做一些多线程练习,但无法编译此代码。我在网上搜索过,但到目前为止还不确定原因。
\n\n#include <condition_variable>\n#include <functional>\n#include <iostream>\n#include <mutex>\n#include <thread>\n\nusing namespace std;\n\nclass FooBar {\n private:\n int n;\n\n public:\n FooBar(int n) {\n this->n = n;\n }\n\n void foo(function<void()> printFoo) {\n for (int i = 0; i < n; i++) {\n printFoo();\n }\n }\n\n std::mutex foo_mtx;\n std::condition_variable foo_cv;\n};\n\nvoid printFoo()\n{\n cout << "foo";\n}\n\nint main ()\n{\n FooBar foobar(10);\n std::thread foo_thread = std::thread(&FooBar::foo, foobar, printFoo);\n foo_thread.join();\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果我不添加互斥体和条件变量,此代码可以编译并运行良好。
\n\nerror: use of deleted function \xe2\x80\x98FooBar::FooBar(const FooBar&)\xe2\x80\x99\nerror: use of deleted function \xe2\x80\x98std::mutex::mutex(const std::mutex&)\xe2\x80\x99\nerror: use of deleted …Run Code Online (Sandbox Code Playgroud) 我正在学习 C++11 中的条件变量,并根据示例代码编写了这个程序。
目标是将生产者生成并由消费者推入向量的前十个自然整数累积在向量中。然而它不起作用,因为例如在某些运行中,向量仅包含 1、7 和 10。
#include <mutex>
#include <condition_variable>
#include<vector>
#include <iostream>
#include <cstdio>
std::mutex mut;
#define MAX 10
int counter;
bool isIncremented = false;
std::vector<int> vec;
std::condition_variable condvar;
void producer() {
while (counter < MAX) {
std::lock_guard<std::mutex> lg(mut);
++counter;
isIncremented = true;
condvar.notify_one();
}
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> ul(mut);
condvar.wait(ul, [] { return isIncremented; });
vec.push_back(counter);
isIncremented = false;
if (counter >= MAX) {
break;
}
}
}
int main(int argc, char *argv[]) …Run Code Online (Sandbox Code Playgroud) 采取这个代码:
std::condition_variable var;
var.wait(lock, [&sharedBool] { return sharedBool; });
Run Code Online (Sandbox Code Playgroud)
当var从sharedBool读取时,线程安全吗?如果不是,那么这样做sharedBool合理std::atomic<bool>吗?
我在下面的代码中遇到错误.
recursive_mutex m_RecurMutex;
condition_variable cond;
unique_lock<recursive_mutex> lock(m_RecurMutex);
cond.wait(lock); // Error Here.
Run Code Online (Sandbox Code Playgroud)
导致此错误的原因是什么?
global variable 'temp';
**threadA**
-pthread_mutex_lock-
if (temp == 'x')
-pthread_cond_wait-
do this
-pthread_mutex_unlock-
**threadB**
-pthread_mutex_lock-
if (someCondition == true)
temp = 'x'
-pthread_cond_signal-
-pthread_mutex_unlock-
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我可能没有任何循环,我只有一个if条件.所以,我希望当temp =='x'时,那么threadA应该这样做/ this.
pthread_cond_wait吗? 据说需要Mutex来保护条件变量.
这里引用的是实际条件变量声明为pthread_cond_t
OR
的正常共享变量,count其值决定信令并等待.
?
如果之前有人问我,我很抱歉,我无法在网上找到它.为什么编译器认为我试图调用复制构造函数std::condition_variable?
#include <iostream>
#include <utility>
#include <vector>
#include <memory>
#include <condition_variable>
using namespace std;
class A {
public:
A() = default;
A(A&&) = default;
A& operator=(A&&) = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
};
int main() {
std::vector<std::shared_ptr<std::condition_variable>> m;
m.push_back(std::make_shared<std::condition_variable>(std::condition_variable{}));
// no complains here
std::vector<std::shared_ptr<A>> m_a;
m_a.push_back(std::make_shared<A>(A{}));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是我试图使用已删除的复制构造函数std::condition_variable..我想我想问的是为什么移动构造函数不会被调用make_shared
为什么condition_variable不是MoveConstructible(根据http://en.cppreference.com/w/cpp/thread/condition_variable)?这禁止包含在许多std::unordered_map移动物体的容器(例如)中.
这迫使人们使用unique_ptr一个额外的堆分配,这make_shared是为了解决而构建的.此外,如果没有池分配器,这可能会变得非常低效.
我正在学习pthread_cond_t并编写以下代码,旨在永远阻止pthread_cond_wait():
// main.cpp
// Intentionally blocks forever.
#include <iostream>
#include <cstring>
#include <cerrno>
#include <pthread.h>
int main( int argc, char* argv[] )
{
pthread_cond_t cond;
if ( pthread_cond_init( &cond, NULL ) )
{
std::cout << "pthread_cond_init() failed: " << errno << "(" << strerror( errno ) << ")" << std::endl;
}
pthread_mutex_t mutex;
if ( pthread_mutex_init( &mutex, NULL ) )
{
std::cout << "pthread_mutex_init() failed: " << errno << "(" << strerror( errno ) << ")" …Run Code Online (Sandbox Code Playgroud)