Я защитил станд.:: функции доступа очереди, продвиньте, вытолкайте, измерьте с повышением:: взаимные исключения и повышение:: взаимное исключение:: scoped_lock в этих функциях
время от времени это отказывает в ограниченной по объему блокировке
стек вызовов - это:
0 0x0040f005 boost::detail::win32::interlocked_bit_test_and_set include/boost/thread/win32/thread_primitives.hpp 361
1 0x0040e879 boost::detail::basic_timed_mutex::timed_lock include/boost/thread/win32/basic_timed_mutex.hpp 68
2 0x0040e9d3 boost::detail::basic_timed_mutex::lock include/boost/thread/win32/basic_timed_mutex.hpp 64
3 0x0040b96b boost::unique_lock<boost::mutex>::lock include/boost/thread/locks.hpp 349
4 0x0040b998 unique_lock include/boost/thread/locks.hpp 227
5 0x00403837 MyClass::inboxSize - this is my inboxSize function that uses this code:
MyClass::inboxSize ()
{
boost::mutex::scoped_lock scoped_lock(m_inboxMutex);
return m_inbox.size();
}
and the mutex is declared like this:
boost::mutex m_inboxMutex;
это отказывает в последней вставляемой строке в этой функции:
inline bool interlocked_bit_test_and_set(long* x,long bit)
{
long const value=1<<bit;
long old=*x;
и x имеет это значение: 0xababac17
Спасибо за справку
Думаю, вы неправильно создали экземпляр MyClass. Как указатель на MyClass, который не был правильно инициализирован, а затем использовался таким образом ptr-> inboxSize ()
.
Значение x мне кажется подозрительным.
Это немного похоже на 0xabababab, которое может быть начальным значением, присвоенным выделенной памяти в режиме отладки, или, возможно, частью охранных значений, чтобы указать, записаны ли выделенные блоки памяти за пределами конца или начала
Вы можете отследить, где это значение взято из?