std::condition_variable::notify_one - cppreference.com

##### cppreference.com

##### Search

Create account

##### Namespaces

- Page
- Discussion

##### Variants

##### Views

- View
- Edit
- History

##### Actions

# std::condition_variable::notify_one

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

[edit template]

void notify_one(); |  | (since C++11)

If any threads are waiting on *this, calling `notify_one` unblocks one of the waiting threads.

### [edit] Parameters

(none)

### [edit] Return value

(none)

### [edit] Exceptions

`noexcept` specification:
noexcept

### [edit] Notes

The effects of `notify_one()`/`notify_all()` and `wait()`/`wait_for()`/`wait_until()` take place in a single total order, so it's impossible for `notify_one()` to, for example, be delayed and unblock a thread that started waiting just after the call to `notify_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.

### [edit] Example

Run this code

    #include <iostream>
    #include <condition_variable>
    #include <thread>
    #include <chrono>

    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 == 1\n";
        done = true;
    }

    void signals()
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout << "Notifying falsely...\n";
        cv.notify_one();
       //Most probably, the waiting thread is awaken unnecessarily.

        std::unique_lock<std::mutex> lk(cv_m);
        i = 1;
        while (!done)
        {
            std::cout << "Notifying true change...\n";
            lk.unlock(); //It is a good idea unlock before notifying.
            cv.notify_one();
            std::this_thread::sleep_for(std::chrono::seconds(1));
            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

notify_all | notifies all waiting threads (public member function) [edit]

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/thread/condition_variable/notify_one&oldid=51338"
Category:

- unconditionally noexcept