添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Filesystem library (C++17) Regular expressions library (C++11) Concurrency support library (C++11) Technical specifications Symbols index External libraries
[edit]
Concurrency support library
Threads
(C++11)
(C++20)
(C++20)
this_thread namespace
(C++11)
(C++11)
(C++11)
Mutual exclusion
(C++11)
Generic lock management
(C++11)
(C++11)
(C++11)
(C++11) (C++11) (C++11)
(C++11)
call_once
(C++11)
Condition variables
condition_variable
(C++11)
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Safe Reclamation
(C++26)
(C++26)
Hazard Pointers
(C++26)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
Free functions for atomic operations
Free functions for atomic flags
atomic_flag_test_and_set atomic_flag_test_and_set_explicit
(C++11) (C++11)
Defined in header <condition_variable>

std::condition_variable is a synchronization primitive used with a std::mutex to block one or more threads until another thread both modifies a shared variable (the condition ) and notifies the std::condition_variable .

The thread that intends to modify the shared variable must:

  1. Acquire a std::mutex (typically via std::lock_guard ).
  2. Modify the shared variable while the lock is owned.
  3. Call notify_one or notify_all on the std::condition_variable (can be done after releasing the lock).

    Even if the shared variable is atomic, it must be modified while owning the mutex to correctly publish the modification to the waiting thread.

    Any thread that intends to wait on a std::condition_variable must:

    1. Acquire a std:: unique_lock < std:: mutex > on the mutex used to protect the shared variable.
    2. Do one of the following:
      1. Check the condition, in case it was already updated and notified.
      2. Call wait , wait_for , or wait_until on the std::condition_variable (atomically releases the mutex and suspends thread execution until the condition variable is notified, a timeout expires, or a spurious wakeup occurs, then atomically acquires the mutex before returning).
      3. Check the condition and resume waiting if not satisfied.
        1. Use the predicated overload of wait , wait_for , and wait_until , which performs the same three steps.

          std::condition_variable works only with std:: unique_lock < std:: mutex > , which allows for maximal efficiency on some platforms. std::condition_variable_any provides a condition variable that works with any BasicLockable object, such as std::shared_lock .

          Condition variables permit concurrent invocation of the wait , wait_for , wait_until , notify_one and notify_all member functions.

          The class std::condition_variable is a StandardLayoutType . It is not CopyConstructible , MoveConstructible , CopyAssignable , or MoveAssignable .

          Contents

        2. 1 Nested types
        3. 2 Member functions
        4. 2.1 Notification
        5. 2.2 Waiting
        6. 2.3 Native handle
        7. 3 Example
        8. 4 See also
        9. [ edit ] Nested types

          Definition

          [ edit ] Example

          std::condition_variable is used in combination with a std::mutex to facilitate inter-thread communication.

          #include <condition_variable>
          #include <iostream>
          #include <mutex>
          #include <string>
          #include <thread>
          std::mutex m;
          std::condition_variable cv;
          std::string data;
          bool ready = false;
          bool processed = false;
          void worker_thread()
              // wait until main() sends data
              std::unique_lock lk(m);
              cv.wait(lk, []{ return ready; });
              // after the wait, we own the lock
              std::cout << "Worker thread is processing data\n";
              data += " after processing";
              // send data back to main()
              processed = true;
              std::cout << "Worker thread signals data processing completed\n";
              // manual unlocking is done before notifying, to avoid waking up
              // the waiting thread only to block again (see notify_one for details)
              lk.unlock();
              cv.notify_one();
          int main()
              std::thread worker(worker_thread);
              data = "Example data";
              // send data to the worker thread
                  std::lock_guard lk(m);
                  ready = true;
                  std::cout << "main() signals data ready for processing\n";
              cv.notify_one();
              // wait for the worker
                  std::unique_lock lk(m);
                  cv.wait(lk, []{ return processed; });
              std::cout << "Back in main(), data = " << data << '\n';
              worker.join();
          

          Output:

          main() signals data ready for processing
          Worker thread is processing data
          Worker thread signals data processing completed
          Back in main(), data = Example data after processing

          [edit] See also

          provides a condition variable associated with any lock type
          (class) [edit]
          (C++11)
          provides basic mutual exclusion facility
          (class) [edit]
          (C++11)
          implements a strictly scope-based mutex ownership wrapper
          (class template) [edit]
          implements movable mutex ownership wrapper
          (class template) [edit]
          Toolbox
        10. What links here
        11. Related changes
        12. Upload file
        13. Special pages
        14. Printable version
        15. Page information
          • In other languages
        16. Deutsch
        17. Español
        18. Français
        19. Italiano
        20. 日本語
        21. Português
        22. Русский
        23. 中文