Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::condition_variable

      From cppreference.com
      <cpp‎ |thread
       
       
      Concurrency support library
      Threads
      (C++11)
      (C++20)
      this_thread namespace
      (C++11)
      (C++11)
      (C++11)
      Cooperative cancellation
      Mutual exclusion
      Generic lock management
      (C++11)
      (C++11)
      (C++11)
      (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)
      Safe reclamation
      Hazard pointers
      Atomic types
      (C++11)
      (C++20)
      Initialization of atomic types
      (C++11)(deprecated in C++20)
      (C++11)(deprecated in C++20)
      Memory ordering
      (C++11)(deprecated in C++26)
      Free functions for atomic operations
      Free functions for atomic flags
       
       
      Defined in header<condition_variable>
      class condition_variable;
      (since C++11)

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

      The thread that intends to modify the shared variable must:

      1. Acquire astd::mutex (typically viastd::lock_guard).
      2. Modify the shared variable while the lock is owned.
      3. Callnotify_one ornotify_all on thestd::condition_variable (can be done after releasing the lock).

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

      Any thread that intends to wait on astd::condition_variable must:

      1. Acquire astd::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. Callwait,wait_for, orwait_until on thestd::condition_variable (atomically releases the mutex and suspends thread execution until the condition variable is notified, a timeout expires, or aspurious wakeup occurs, then atomically acquires the mutex before returning).
      3. Check the condition and resume waiting if not satisfied.
      or:
      1. Use the predicated overload ofwait,wait_for, andwait_until, which performs the same three steps.

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

      Condition variables permit concurrent invocation of thewait,wait_for,wait_until,notify_one andnotify_all member functions.

      The classstd::condition_variable is aStandardLayoutType. It is notCopyConstructible,MoveConstructible,CopyAssignable, orMoveAssignable.

      Contents

      [edit]Nested types

      Name Definition
      native_handle_type implementation-defined

      [edit]Member functions

      constructs the object
      (public member function)[edit]
      destructs the object
      (public member function)[edit]
      operator=
      [deleted]
      not copy-assignable
      (public member function)[edit]
      Notification
      notifies one waiting thread
      (public member function)[edit]
      notifies all waiting threads
      (public member function)[edit]
      Waiting
      blocks the current thread until the condition variable is awakened
      (public member function)[edit]
      blocks the current thread until the condition variable is awakened or after the specified timeout duration
      (public member function)[edit]
      blocks the current thread until the condition variable is awakened or until specified time point has been reached
      (public member function)[edit]
      Native handle
      returns the native handle
      (public member function)[edit]

      [edit]Example

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

      Run this code
      #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 datastd::unique_lock lk(m);    cv.wait(lk,[]{return ready;}); // after the wait, we own the lockstd::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 processingWorker thread is processing dataWorker thread signals data processing completedBack 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]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/thread/condition_variable&oldid=170070"

      [8]ページ先頭

      ©2009-2025 Movatter.jp