std::condition_variable::wait

来自cppreference.com

 
 
线程支持库
线程
(C++11)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
互斥
(C++11)
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
期货
(C++11)
(C++11)
(C++11)
(C++11)
 
std::condition_variable
成员函数
原文:
Member functions
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
通知
原文:
Notification
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
等待
原文:
Waiting
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
condition_variable::wait
本机手柄
原文:
Native handle
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
 
void wait( std::unique_lock<std::mutex>& lock );
(1) (C++11 起)
template< class Predicate >
void wait( std::unique_lock<std::mutex>& lock, Predicate pred );
(2) (C++11 起)
wait导致当前线程阻塞,直到条件变量的通知,或一个虚假唤醒时,可选择循环,直到满足一些谓词.
原文:
wait causes the current thread to block until the condition variable is notified or a spurious wakeup occurs, optionally looping until some predicate is satisfied.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
1)
自动释放lock,阻塞当前执行的线程,并把它添加到列表中的线程等待*this。畅通时,线程将被notify_all()notify_one()执行。它也可以畅通不合逻辑的。当畅通,不管是什么原因,lock是重新收购和wait退出。如果这个函数异常退出,lock也重新获得.
原文:
Atomically releases lock, blocks the current executing thread, and adds it to the list of threads waiting on *this. The thread will be unblocked when notify_all() or notify_one() is executed. It may also be unblocked spuriously. When unblocked, regardless of the reason, lock is reacquired and wait exits. If this function exits via exception, lock is also reacquired.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
2)
等效
原文:
Equivalent to
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

while (!pred()) {
  wait(lock);
}

可使用此重载忽略虚假的觉醒,在等待一个特定的条件下成为真正的.
原文:
This overload may be used to ignore spurious awakenings while waiting for a specific condition to become true.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

目录

[编辑] 参数

lock -
一个std::unique_lock<std::mutex>类型的对象,它必须被锁定由当前线程
原文:
an object of type std::unique_lock<std::mutex>, which must be locked by the current thread
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
pred -
是否应该继续等待
原文:
if the waiting should be continued
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
则返回 ​false 的谓词。

谓词函数的签名应等价于如下者:

 bool pred();

[编辑] 返回值

(无)
原文:
(none)
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 例外

可能会引发std::system_error,也可能抛出的异常的lock.lock()lock.unlock()传播.
原文:
May throw std::system_error, may also propagate exceptions thrown by lock.lock() or lock.unlock().
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 注释

lock.mutex()调用此函数,如果没有被锁定由当前线程是不确定的行为.
原文:
Calling this function if lock.mutex() is not locked by the current thread is undefined behavior.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
lock.mutex()调用此函数,如果使用的所有其他线程当前正在等待同一个条件变量是不确定的行为是不相同的互斥.
原文:
Calling this function if lock.mutex() is not the same mutex as the one used by all other threads that are currently waiting on the same condition variable is undefined behavior.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 为例

[编辑]
#include <iostream>
#include <condition_variable>
#include <thread>
#include <chrono>
 
std::condition_variable cv;
std::mutex cv_m;
int i = 0;
 
void waits()
{
    std::unique_lock<std::mutex> lk(cv_m);
    std::cerr << "Waiting... \n";
    cv.wait(lk, [](){return i == 1;});
    std::cerr << "...finished waiting. i == 1\n";
}
 
void signals()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cerr << "Notifying...\n";
    cv.notify_all();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    i = 1;
    std::cerr << "Notifying again...\n";
    cv.notify_all();
}
 
int main()
{
    std::thread t1(waits), t2(waits), t3(waits), t4(signals);
    t1.join(); 
    t2.join(); 
    t3.join();
    t4.join();
}

输出:

Waiting...
Waiting...
Waiting...
Notifying...
Notifying again...
...finished waiting. i == 1
...finished waiting. i == 1
...finished waiting. i == 1

[编辑] 另请参阅

阻塞当前线程,直到条件变量被唤醒,或到指定时限时间段之后
(公开成员函数) [编辑]
阻塞当前线程,直到条件变量被唤醒,或直到抵达指定时间点
(公开成员函数) [编辑]