标签: condition-variable

一般来说,处理虚假唤醒的正确方法是什么?

在下面的选项中,使用条件变量时是否有正确的方法来处理虚假唤醒?

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++ 中的条件变量相当陌生,我不确定我读到的一些代码是否处理虚假唤醒的情况。

c++ condition-variable c++11 spurious-wakeup

4
推荐指数
1
解决办法
4936
查看次数

使用互斥锁和条件变量作为成员时如何修复“使用已删除函数”?

我正在做一些多线程练习,但无法编译此代码。我在网上搜索过,但到目前为止还不确定原因。

\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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我不添加互斥体和条件变量,此代码可以编译并运行良好。

\n\n
error: 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++ mutex condition-variable

4
推荐指数
1
解决办法
3147
查看次数

条件变量基本示例

我正在学习 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)

c++ condition-variable

4
推荐指数
1
解决办法
1815
查看次数

std::condition_variable 等待谓词是线程安全的吗?

采取这个代码:

std::condition_variable var;
var.wait(lock, [&sharedBool] { return sharedBool; });
Run Code Online (Sandbox Code Playgroud)

var从sharedBool读取时,线程安全吗?如果不是,那么这样做sharedBool合理std::atomic<bool>吗?

c++ condition-variable

4
推荐指数
1
解决办法
135
查看次数

提升condition_variable参数错误

我在下面的代码中遇到错误.

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)

导致此错误的原因是什么?

boost condition-variable recursive-mutex

3
推荐指数
1
解决办法
1712
查看次数

没有while循环的pthread_cond_wait

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吗?
  • 如果我们不需要循环,编写代码的另一种方法是什么?
  • 这是编写代码的正确方法吗?

multithreading mutex pthreads condition-variable

3
推荐指数
1
解决办法
1569
查看次数

需要互斥锁来保护条件变量

据说需要Mutex来保护条件变量.

这里引用的是实际条件变量声明为pthread_cond_t
OR
的正常共享变量,count其值决定信令并等待.

mutex pthreads condition-variable

3
推荐指数
1
解决办法
2826
查看次数

创建条件变量的共享指针时出现问题

如果之前有人问我,我很抱歉,我无法在网上找到它.为什么编译器认为我试图调用复制构造函数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

c++ condition-variable shared-ptr c++11

3
推荐指数
1
解决办法
639
查看次数

为什么condition_variable不是MoveAssignable

为什么condition_variable不是MoveConstructible(根据http://en.cppreference.com/w/cpp/thread/condition_variable)?这禁止包含在许多std::unordered_map移动物体的容器(例如)中.

这迫使人们使用unique_ptr一个额外的堆分配,这make_shared是为了解决而构建的.此外,如果没有池分配器,这可能会变得非常低效.

c++ move condition-variable c++11

3
推荐指数
1
解决办法
601
查看次数

为什么pthread_cond_wait()在没有与"-lpthread"链接时不会阻塞?

我正在学习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)

c c++ glibc pthreads condition-variable

3
推荐指数
1
解决办法
183
查看次数