boost try_mutex не компилится пример
От: Oleg_apx  
Дата: 25.07.09 11:08
Оценка:
Пример отсюда: http://www.brainbell.com/tutorials/C++/Making_A_Resource_Thread-Safe.htm

bool dequeue(T& x) {
   boost::try_mutex::scoped_try_lock lock(tryMutex_);

   if (!lock.locked( ))
      return(false);
   else {
      if (list_.empty( ))
         throw "empty!";
      x = list_.front( );
      list_.pop_front( );
      return(true);
   }
}
private:
boost::try_mutex tryMutex_;
// ...


студия пишет:
error C2039: 'locked' : is not a member of 'boost::detail::try_lock_wrapper<Mutex>'

Я как-то неправильно пользуюсь try_mutex?
Re: boost try_mutex не компилится пример
От: Аноним  
Дата: 25.07.09 14:54
Оценка:
O_>Я как-то неправильно пользуюсь try_mutex?

Трудно заглянуть в документацию?
http://www.boost.org/doc/libs/1_39_0/doc/html/thread/synchronization.html#thread.synchronization.locks.scoped_try_lock
Re[2]: boost try_mutex не компилится пример
От: Oleg_apx  
Дата: 25.07.09 15:43
Оценка:
Здравствуйте, Аноним, Вы писали:

O_>>Я как-то неправильно пользуюсь try_mutex?


А>Трудно заглянуть в документацию?

А>http://www.boost.org/doc/libs/1_39_0/doc/html/thread/synchronization.html#thread.synchronization.locks.scoped_try_lock

И все-таки хотелось бы увидеть пример правильного использования.

Мне нужно, чтобы если один из потоков уже работает с объектом (например находящимся в списке), то другой поток не должен ждать первого, а переходить к следующему..
Re[3]: boost try_mutex не компилится пример
От: Аноним  
Дата: 25.07.09 17:37
Оценка:
O_>Мне нужно, чтобы если один из потоков уже работает с объектом (например находящимся в списке), то другой поток не должен ждать первого, а переходить к следующему..

И в чём сложности? Идём по моей ссылке, смотрим какие есть методы в описании scoped_try_lock, находим там owns_lock (по-моему, по названию и типу уже легко догадаться что делает эта функция) и не находим locked (если нету такой функции, то с чего бы твоему примеру компилироваться?). Дальше читаем: "The semantics of each constructor and member function are identical to those of boost::unique_lock<MutexType> for the same MutexType, except that the constructor that takes a single reference to a mutex will call m.try_lock() rather than m.lock()." Переходим к описанию boost::unique_lock&lt;MutexType&gt;, снова находим там owns_lock и его описание:

bool owns_lock() const

Returns:
true if the *this owns the lock on the Lockable object associated with *this.

Throws:
Nothing.

Если неясно что делает конструктор scoped_try_lock, то читаем описание конструктора unique_lock (в доке сказано, что он ведёт себя аналогично):

unique_lock(Lockable & m,boost::try_to_lock_t)

Effects:
Stores a reference to m. Invokes m.try_lock(), and takes ownership of the lock state if the call returns true.

Postcondition:
mutex() returns &m. If the call to try_lock() returned true, then owns_lock() returns true, otherwise owns_lock() returns false.

Throws:
Nothing.

Делаем выводы: если конструктор boost::try_mutex::scoped_try_lock захватывает владение мьютексом, то owns_lock() возвращает true, а иначе — false. Если внимательно приглядеться к другим функциям, то можно увидеть, что вместо вызова owns_lock можно использовать неявное преобразование к bool или operator!. Что тут может быть непонятно? Я сам никогда не пользовался Boost.Thread, но причину проблемы и способ её решения нашёл за 5 минут. Чтобы напечатать и отформатировать этот пост, у меня времени ушло втрое больше.
Re[4]: boost try_mutex не компилится пример
От: Oleg_apx  
Дата: 25.07.09 18:05
Оценка:
А>Делаем выводы: если конструктор boost::try_mutex::scoped_try_lock захватывает владение мьютексом, то owns_lock() возвращает true, а иначе — false. Если внимательно приглядеться к другим функциям, то можно увидеть, что вместо вызова owns_lock можно использовать неявное преобразование к bool или operator!. Что тут может быть непонятно? Я сам никогда не пользовался Boost.Thread, но причину проблемы и способ её решения нашёл за 5 минут. Чтобы напечатать и отформатировать этот пост, у меня времени ушло втрое больше.

Спасибо за потраченное время, но мне все равно интересно мнение людей, которые имели опыт решение подобной проблемы при помощи boost.
Иначе, если есть документация, то зачем нужны форумы?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.