Информация об изменениях

Сообщение Re[2]: В STL почему нет аналога Event Objects(Win32) от 26.02.2015 10:27

Изменено 26.02.2015 11:55 Videoman

Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, PowerUserX, Вы писали:


CS>Наверное потому что такой примитив добавить тривиально можно, как-то так:


CS>
CS>    class event
CS>    {
CS>      event( const event& ) = delete;
CS>      event& operator=(const event&) = delete;

CS>      std::condition_variable_any _var;
CS>      std::mutex                  _mtx;
CS>    public:
CS>      event() {}
CS>      void signal() {
CS>          _var.notify_one();
CS>      }
CS>      void wait() {
CS>          std::unique_lock<std::mutex> lock(_mtx);
CS>          _var.wait(lock);
CS>      }

CS>    };
CS>



CS>wait(chrono::duration) добавить по вкусу.


Абсолюьно неправильная реализация :
Во первых wait может сработать просто так (фантомные просыпания).
Во вторых если один поток сделает notify_one а второй не будет сидеть в этот момент на wait, то событие уйдет в небытие. О нем никто некогда не узнает.
Re[2]: В STL почему нет аналога Event Objects(Win32)
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, PowerUserX, Вы писали:


CS>Наверное потому что такой примитив добавить тривиально можно, как-то так:


CS>
CS>    class event
CS>    {
CS>      event( const event& ) = delete;
CS>      event& operator=(const event&) = delete;

CS>      std::condition_variable_any _var;
CS>      std::mutex                  _mtx;
CS>    public:
CS>      event() {}
CS>      void signal() {
CS>          _var.notify_one();
CS>      }
CS>      void wait() {
CS>          std::unique_lock<std::mutex> lock(_mtx);
CS>          _var.wait(lock);
CS>      }

CS>    };
CS>



CS>wait(chrono::duration) добавить по вкусу.


Абсолюьно неправильная реализация :
Во-первых, wait может сработать просто так (фантомные просыпания).
Во-вторых, если один поток сделает notify_one а второй не будет сидеть в этот момент на wait, то событие уйдет в небытие. О нем никто никогда не узнает.