Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::condition_variable::notify_one

      From cppreference.com
      <cpp‎ |thread‎ |condition variable

      [edit template]
       
       
      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
      (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
       
       
      void notify_one()noexcept;
      (since C++11)

      If any threads are waiting on*this, callingnotify_one unblocks one of the waiting threads.

      [edit]Notes

      The effects ofnotify_one()/notify_all() and each of the three atomic parts ofwait()/wait_for()/wait_until() (unlock+wait, wakeup, and lock) take place in a single total order that can be viewed asmodification order of an atomic variable: the order is specific to this individual condition variable. This makes it impossible fornotify_one() to, for example, be delayed and unblock a thread that started waiting just after the call tonotify_one() was made.

      The notifying thread does not need to hold the lock on the same mutex as the one held by the waiting thread(s); in fact doing so is a pessimization, since the notified thread would immediately block again, waiting for the notifying thread to release the lock. However, some implementations (in particular many implementations of pthreads) recognize this situation and avoid this “hurry up and wait” scenario by transferring the waiting thread from the condition variable's queue directly to the queue of the mutex within the notify call, without waking it up.

      Notifying while under the lock may nevertheless be necessary when precise scheduling of events is required, e.g., if the waiting thread would exit the program if the condition is satisfied, causing destruction of the notifying thread's condition variable. A spurious wakeup after mutex unlock but before notify would result in notify called on a destroyed object.

      [edit]Example

      Run this code
      #include <chrono>#include <condition_variable>#include <iostream>#include <thread>usingnamespace std::chrono_literals; std::condition_variable cv;std::mutex cv_m;int i=0;bool done=false; void waits(){std::unique_lock<std::mutex> lk(cv_m);std::cout<<"Waiting...\n";    cv.wait(lk,[]{return i==1;});std::cout<<"...finished waiting; i == "<< i<<'\n';    done=true;} void signals(){std::this_thread::sleep_for(200ms);std::cout<<"Notifying falsely...\n";    cv.notify_one();// waiting thread is notified with i == 0.// cv.wait wakes up, checks i, and goes back to waiting std::unique_lock<std::mutex> lk(cv_m);    i=1;while(!done){std::cout<<"Notifying true change...\n";        lk.unlock();        cv.notify_one();// waiting thread is notified with i == 1, cv.wait returnsstd::this_thread::sleep_for(300ms);        lk.lock();}} int main(){std::thread t1(waits), t2(signals);    t1.join();     t2.join();}

      Possible output:

      Waiting... Notifying falsely...Notifying true change......finished waiting; i == 1

      [edit]See also

      notifies all waiting threads
      (public member function)[edit]
      C documentation forcnd_signal
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/thread/condition_variable/notify_one&oldid=133351"

      [8]ページ先頭

      ©2009-2025 Movatter.jp