为什么我不能从派生 class 锁定基础 class 互斥体?
Why can't I lock a base class mutex from a derived class?
我有一个基 class B() 和一个成员变量 pthread_mutex_t m
。当我尝试从派生 class 锁定互斥量时,我会永远阻塞。我打开 GDB 并打印出 m
的样子,它看起来像是乱码(未实例化),但我不确定。
基地Class
class B
{
protected: //or public!
pthread_mutex_t m;
public:
virtual void lock(); //wrapper for pthread_mutex_lock(&m)
virtual void unlock(); //wrapper
};
派生Class
class D : B
{
public:
void foo();
private:
pthread_mutex_t derived_m;
};
这是我拥有的无限期阻塞的代码。
D::foo() {
//for reference below, gdb prints were taken here.
pthread_mutex_lock(&m); //blocks forever
pthread_mutex_lock(&derived_m); //okay
lock(); //blocks forever
}
GDB print() for &m
= {__data = {__lock = -8656, __count = 32767, __owner = 4198302,
__nusers = 0, __kind = 3, __spins = 0, __elision = 0, __list = {
__prev = 0x400fed <__libc_csu_init+77>, __next = 0x0}},
__size = "067777[=15=]0[=15=]067@[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]3[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]057@", '[=15=]0' <repeats 12 times>, __align = 140737488346672}
GDB print() for &derived_m
= {__data = {__lock = 0, __count = 0, __owner = -134225560,
__nusers = 32767, __kind = 14, __spins = 0, __elision = 0,
__list = {__prev = 0x400e7f <Logging::Logging(datastruct*)+67>,
__next = 0x7fffffffddc0}},
__size = "[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0h17777[=16=]0[=16=]06[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]076@[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0057777[=16=]0", __align = 0}
您的互斥体应该首先被初始化。有两个选项可以初始化 pthread 互斥量。
使用宏
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
使用pthread_mutex_init
函数。
请注意,如果您使用的是支持 c++11
的编译器,则应使用标准的 std
多线程工具,例如std::mutex
.
良好的开端:
我有一个基 class B() 和一个成员变量 pthread_mutex_t m
。当我尝试从派生 class 锁定互斥量时,我会永远阻塞。我打开 GDB 并打印出 m
的样子,它看起来像是乱码(未实例化),但我不确定。
基地Class
class B
{
protected: //or public!
pthread_mutex_t m;
public:
virtual void lock(); //wrapper for pthread_mutex_lock(&m)
virtual void unlock(); //wrapper
};
派生Class
class D : B
{
public:
void foo();
private:
pthread_mutex_t derived_m;
};
这是我拥有的无限期阻塞的代码。
D::foo() {
//for reference below, gdb prints were taken here.
pthread_mutex_lock(&m); //blocks forever
pthread_mutex_lock(&derived_m); //okay
lock(); //blocks forever
}
GDB print() for &m
= {__data = {__lock = -8656, __count = 32767, __owner = 4198302,
__nusers = 0, __kind = 3, __spins = 0, __elision = 0, __list = {
__prev = 0x400fed <__libc_csu_init+77>, __next = 0x0}},
__size = "067777[=15=]0[=15=]067@[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]3[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]0[=15=]057@", '[=15=]0' <repeats 12 times>, __align = 140737488346672}
GDB print() for &derived_m
= {__data = {__lock = 0, __count = 0, __owner = -134225560,
__nusers = 32767, __kind = 14, __spins = 0, __elision = 0,
__list = {__prev = 0x400e7f <Logging::Logging(datastruct*)+67>,
__next = 0x7fffffffddc0}},
__size = "[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0h17777[=16=]0[=16=]06[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0[=16=]076@[=16=]0[=16=]0[=16=]0[=16=]0[=16=]0057777[=16=]0", __align = 0}
您的互斥体应该首先被初始化。有两个选项可以初始化 pthread 互斥量。
使用宏
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
使用
pthread_mutex_init
函数。
请注意,如果您使用的是支持 c++11
的编译器,则应使用标准的 std
多线程工具,例如std::mutex
.
良好的开端: