gpt4 book ai didi

c++ - 为什么我不能锁定派生类的基类互斥体?

转载 作者:行者123 更新时间:2023-11-30 01:08:47 25 4
gpt4 key购买 nike

我有一个带有成员变量 pthread_mutex_t m 的基类 B()。当我尝试从派生类中锁定互斥量时,我会永远阻止。我打开 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
};

派生类

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
}

&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}

&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}

最佳答案

你的互斥量应该首先被初始化。有两个选项可以初始化 pthread 互斥量。

  • 使用宏

    pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
  • 使用 pthread_mutex_init 函数。

请注意,如果您使用的是支持c++11 的编译器,您应该使用标准的std 多线程工具,例如std::mutex.

良好的开端:

关于c++ - 为什么我不能锁定派生类的基类互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41436480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com