Ato*_*r94 1 c++ inheritance mutex
我有一个带有成员变量的基类B()pthread_mutex_t m。当我尝试锁定派生类中的互斥锁时,我将永远被阻止。我打开GDB并打印出m看起来像乱码(未实例化)的图片,但是我不确定。
基类
class B
{
protected: //or public!
pthread_mutex_t m;
public:
virtual void lock(); //wrapper for pthread_mutex_lock(&m)
virtual void unlock(); //wrapper
};
Run Code Online (Sandbox Code Playgroud)
派生类
class D : B
{
public:
void foo();
private:
pthread_mutex_t derived_m;
};
Run Code Online (Sandbox Code Playgroud)
这是我无限期阻止的代码。
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
}
Run Code Online (Sandbox Code Playgroud)
用于&m的GDB print()
$1 = {__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 = "0\336\377\377\377\177\000\000\236\017@\000\000\000\000\000\003\000\000\000\000\000\000\000\355\017@", '\000' <repeats 12 times>, __align = 140737488346672}
Run Code Online (Sandbox Code Playgroud)
用于&derived_m的GDB print()
$2 = {__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 = "\000\000\000\000\000\000\000\000h\341\377\367\377\177\000\000\016\000\000\000\000\000\000\000\177\016@\000\000\000\000\000\300\335\377\377\377\177\000", __align = 0}
Run Code Online (Sandbox Code Playgroud)
您的互斥锁应首先初始化。有两个选项可以初始化pthread互斥锁。
使用宏
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
Run Code Online (Sandbox Code Playgroud)使用pthread_mutex_init功能。
请注意,如果您使用的是已c++11启用的编译器,则应使用标准的std多线程工具,例如std::mutex。
良好的开端:
| 归档时间: |
|
| 查看次数: |
567 次 |
| 最近记录: |