我正在使用 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
互斥锁的默认值。我的问题是:
包含协议属性的默认值是否
pthread_mutexattr_t
具有 PTHREAD_PRIO_PROTECT 值?如果是你,我的问题会变得最糟糕,因为我依赖于尝试锁定互斥锁的线程优先级。我的线程是由创建的
ACE_Task_Base::activate
。你能告诉我ace默认线程优先级是什么吗?
我在linux redhat上运行...