я работаю с классом boost :: mutex для синхронизации 2 потоков на одном ресурсе.
я получаю исключение, когда я вызываю следующее boost:mutex:lock()
функция:
lock()
{
int const res=pthread_mutex_lock(&m);
if(res)
{
boost::throw_exception(lock_error(res));
}
}
res = 22, что является EINVAL.
когда я смотрю на справочную страницу pthread_mutex_lock
Я вижу, что функция не будет EINVAL в следующих случаях:
EINVAL:
Значение, указанное в mutex, не относится к инициализированному объекту mutex.
эта опция не актуальна, так как boost: mutex конструктор инициализирует pthread_mutex_t.
EINVAL:
Мьютекс был создан с атрибутом протокола, имеющим значение PTHREAD_PRIO_PROTECT, и приоритет вызывающего потока выше, чем текущий потолок приоритета мьютекса.
этот вариант гораздо разумнее.
когда вы смотрите на инициализацию pthread_mutex_t в custructor boost :: mutex, вы видите:
mutex()
{
int const res=pthread_mutex_init(&m,NULL);
if(res)
{
boost::throw_exception(thread_resource_error());
}
}
это означает, что Boost использовать по умолчанию pthread_mutexattr_t
для мьютекса.
мой вопрос:
делает значение по умолчанию pthread_mutexattr_t
включает атрибут протокола со значением PTHREAD_PRIO_PROTECT?
если вы, моя проблема становится хуже, так как я зависим от приоритета потока, который пытается заблокировать мьютекс. моя тема создана ACE_Task_Base::activate
, Можете ли вы сказать мне, что является приоритетом темы по умолчанию туза?
я работаю на Linux Redhat …
Задача ещё не решена.
Других решений пока нет …