2

我正在使用 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 指定的值不引用已初始化的互斥对象。

此选项不相关,因为 boost:mutex 构造函数初始化 pthread_mutex_t。

EINVAL:互斥体是使用值为 PTHREAD_PRIO_PROTECT 的协议属性创建的,并且调用线程的优先级高于互斥体的当前优先级上限。

这个选项更合理。当您查看 boost::mutex custructor 中 pthread_mutex_t 的初始化时,您会看到:

mutex()
 {
   int const res=pthread_mutex_init(&m,NULL);
   if(res)
   {
       boost::throw_exception(thread_resource_error());
   }
 }

这意味着 boost 使用pthread_mutexattr_t互斥锁的默认值。我的问题是:

  1. 包含协议属性的默认值是否pthread_mutexattr_t具有 PTHREAD_PRIO_PROTECT 值?

  2. 如果是你,我的问题会变得最糟糕,因为我依赖于尝试锁定互斥锁的线程优先级。我的线程是由创建的ACE_Task_Base::activate。你能告诉我ace默认线程优先级是什么吗?

我在linux redhat上运行...

4

0 回答 0