boost::asio
От: morm Россия  
Дата: 30.08.10 15:32
Оценка:
Subj:

Это часть boost/asio/detail/win_event.hpp

class win_event
  : private noncopyable
{
public:
  // Constructor.
  win_event()
    : event_(::CreateEvent(0, true, false, 0))
  {
    if (!event_)
    {
      DWORD last_error = ::GetLastError();
      boost::system::system_error e(
          boost::system::error_code(last_error,
            boost::asio::error::get_system_category()),
          "event");
      boost::throw_exception(e);
    }
  }

  // Destructor.
  ~win_event()
  {
    ::CloseHandle(event_);
  }

  // Signal the event.
  template <typename Lock>
  void signal(Lock& lock)
  {
    BOOST_ASSERT(lock.locked());
    (void)lock;
    ::SetEvent(event_);
  }

  // Signal the event and unlock the mutex.
  template <typename Lock>
  void signal_and_unlock(Lock& lock)
  {
    BOOST_ASSERT(lock.locked());
    lock.unlock();
    ::SetEvent(event_);
  }

  // Reset the event.
  template <typename Lock>
  void clear(Lock& lock)
  {
    BOOST_ASSERT(lock.locked());
    (void)lock;
    ::ResetEvent(event_);
  }

  // Wait for the event to become signalled.
  template <typename Lock>
  void wait(Lock& lock)
  {
    BOOST_ASSERT(lock.locked());
    lock.unlock();
    ::WaitForSingleObject(event_, INFINITE);
    lock.lock();
  }

private:
  HANDLE event_;
};


Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.
Re: boost::asio
От: uzhas Ниоткуда  
Дата: 30.08.10 18:53
Оценка:
Здравствуйте, morm, Вы писали:

M>Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.


с какой целью интересуетесь?
в публичном интерфейсе, возможно, такого нет (неймспейс detail непубличен)
Re[2]: boost::asio
От: morm Россия  
Дата: 30.08.10 18:55
Оценка:
Здравствуйте, uzhas, Вы писали:

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


M>>Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.


U>с какой целью интересуетесь?

U>в публичном интерфейсе, возможно, такого нет (неймспейс detail непубличен)

рискнул использовать, но меня убил этот lock, что они имели ввиду? Какое-то масло масляное
Re[3]: boost::asio
От: uzhas Ниоткуда  
Дата: 30.08.10 18:59
Оценка:
Здравствуйте, morm, Вы писали:

M>рискнул использовать, но меня убил этот lock, что они имели ввиду? Какое-то масло масляное

я бустом не пользуюсь, но могу предположить, что это единый механизм сообщить клиенту о неких платформ-спесифик операциях с элементом синхронизации
Re[4]: boost::asio
От: morm Россия  
Дата: 30.08.10 19:04
Оценка:
Здравствуйте, uzhas, Вы писали:

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


M>>рискнул использовать, но меня убил этот lock, что они имели ввиду? Какое-то масло масляное

U>я бустом не пользуюсь, но могу предположить, что это единый механизм сообщить клиенту о неких платформ-спесифик операциях с элементом синхронизации

??? Делать проверку залочен ли внешний мьютекс перед тем как работать со встроенным event'ом?! Что бы это могло быть?
Re: boost::asio
От: c-smile Канада http://terrainformatica.com
Дата: 30.08.10 19:08
Оценка:
Здравствуйте, morm, Вы писали:

M>Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.


Это так называемый conditional wait.
https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables
Re[2]: boost::asio
От: morm Россия  
Дата: 30.08.10 19:53
Оценка:
Здравствуйте, c-smile, Вы писали:

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


M>>Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.


CS>Это так называемый conditional wait.

CS>https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

Я так понимаю это имитация поведения виндового event'а?! Иначе я не понимаю зачем лочить. Но в win_event зачем городить?
Re[3]: boost::asio
От: c-smile Канада http://terrainformatica.com
Дата: 30.08.10 20:05
Оценка:
Здравствуйте, morm, Вы писали:

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


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


M>>>Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.


CS>>Это так называемый conditional wait.

CS>>https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

M>Я так понимаю это имитация поведения виндового event'а?!


Ну нет конечно. В pthreads есть готовый примитив pthread_cond_wait() в windows такого нет.
Посмотри ссылку что я дал (там сайт какой-то странный — нужно F5 пару раз нажать чтобы страница отрендерилась).
Ну или google на conditional wait, conditional variables.

Например в ocaml : http://caml.inria.fr/pub/docs/old-311/libref/Condition.html
Re: boost::asio
От: Sni4ok  
Дата: 30.08.10 23:33
Оценка:
Здравствуйте, morm, Вы писали:

M>Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.


ну как зачем, есть разделяемая переменная и доступ к ней нужно синхронизировать.
Re[2]: boost::asio
От: morm Россия  
Дата: 31.08.10 05:09
Оценка:
Здравствуйте, Sni4ok, Вы писали:

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


M>>Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.


S>ну как зачем, есть разделяемая переменная и доступ к ней нужно синхронизировать.


Возможно мой мозг загажен Win32 API?! Я хочу использовать аналог CreateEvent(), SetEvent(), ResetEvent(). Для меня удивительно, что приходится синхронизировать доступ к объекту ядра, который предназначен для синхронизации Собствено я и искал исползоване этих функций в исходниках win_event, а там такой неприятный сюрприз
Re[4]: boost::asio
От: morm Россия  
Дата: 31.08.10 05:12
Оценка:
Здравствуйте, c-smile, Вы писали:

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


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


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


M>>>>Может кто-нибудь объяснить зачем нужен этот проклятый lock??? Заранее спасибо.


CS>>>Это так называемый conditional wait.

CS>>>https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

M>>Я так понимаю это имитация поведения виндового event'а?!


CS>Ну нет конечно. В pthreads есть готовый примитив pthread_cond_wait() в windows такого нет.

CS>Посмотри ссылку что я дал (там сайт какой-то странный — нужно F5 пару раз нажать чтобы страница отрендерилась).
CS>Ну или google на conditional wait, conditional variables.

CS>Например в ocaml : http://caml.inria.fr/pub/docs/old-311/libref/Condition.html


Condition variables to synchronize between threads.

Condition variables are used when one thread wants to wait until another thread has finished doing something: the former thread ``waits'' on the condition variable, the latter thread ``signals'' the condition when it is done. Condition variables should always be protected by a mutex. The typical use is (if D is a shared data structure, m its mutex, and c is a condition variable):


 Mutex.lock m;
     while (* some predicate P over D is not satisfied *) do
       Condition.wait c m
     done;
     (* Modify D *)
     if (* the predicate P over D is now satified *) then Condition.signal c;
     Mutex.unlock m


Просто повторение того что я писал А зачем?
Re[3]: boost::asio
От: Sni4ok  
Дата: 31.08.10 07:57
Оценка:
Здравствуйте, morm, Вы писали:


M>Возможно мой мозг загажен Win32 API?! Я хочу использовать аналог CreateEvent(), SetEvent(), ResetEvent().


в бусте нету эвентов, но поверх condition'а его легко получить:

class my_event
{
    boost::condition condition;
    my_mutex mutex;
public:
    void notify(){
        condition.notify_all();
    }
    void wait(){
        my_mutex::scoped_lock lock(mutex);
        condition.wait(lock);
    }
    bool timed_wait(boost::uint32_t sec){
        my_mutex::scoped_lock lock(mutex);
        return condition.timed_wait(lock, boost::posix_time::seconds(sec));
    }
};
Re[4]: boost::asio
От: morm Россия  
Дата: 31.08.10 14:36
Оценка:
Здравствуйте, Sni4ok, Вы писали:

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



M>>Возможно мой мозг загажен Win32 API?! Я хочу использовать аналог CreateEvent(), SetEvent(), ResetEvent().


S>в бусте нету эвентов


boost::asio::detailed::event



Не публичный интерфейс, но ЕСТЬ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.