c++ - 无法锁定 Qt 互斥锁 (QReadWriteLock) 访问冲突写入

标签 c++ multithreading qt mutex

这个问题的一些背景是我之前的问题: non-member function pointer as a callback in API to member function (这很可能是无关紧要的)。

回调启动一个写入一些数据的线程。有另一个线程读取相同的数据,这会导致一些崩溃。 我刚刚参加了多线程速成类(class)(感谢 SO),这是我尝试保证作者和读者不会同时访问数据的方法。我正在使用 Qt 的一些互斥机制(QReadWriteLock)。

#include <QSharedPointer>
#include <QReadWriteLock>

Class MyClass
{
public:
  MyClass();
  bool open();
  float getData();
  void streamCB(void* userdata);

protected:
  float private_data_;
  QSharedPointer<QReadWriteLock> lock_;
};

// callback wrapper from non-member C API to member function void
__stdcall streamCBWrapper(void* userdata)
{
   static_cast<MyClass*>(userdata)->streamCB(userdata);
}

// constructor
MyClass::MyClass()
{
  lock_ = QSharedPointer<QReadWriteLock>(new QReadWriteLock());
  lock_->lockForWrite();
  private_data_ = getData();
  lock_->unlock();
}

// member callback
void MyClass:streamCB(void* userdata)
{
  float a = getData(); 
  lock_->lockForWrite(); //*** fails here
  private_data_ = a;
  lock_->unlock();
}

我在运行程序时遇到段错误。 VS 调试器在我标记 //*** 的行上显示 访问冲突写入位置 0x00fedbed。 此处失败。 锁在构造函数中起作用,但在回调中不起作用。

知道出了什么问题吗?我应该看什么? (以及我如何完善我的问题) 谢谢!

其他相关主题 Cannot access private member declared in class 'QReadWriteLock'Error 1 error C2248: 'QReadWriteLock::QReadWriteLock' (我使用了QSharedPointer建议)

编辑 1: 回调已设置

bool MyClass::open()
{
  // stuffs
  int mid = 0;
  set_stream_callback(&streamCBWrapper, &mid);
  // more stuffs
  return true;
}

编辑 2: 感谢您的所有建议。 所以我的错误可能根本不是由于互斥量,而是因为我对 API 缺乏了解?我很困惑..这是 set_stream_callback 的 API 文档。

typedef void (__stdcall *STREAM_CALLBACK)(void *userdata);

/*! @brief Register a callback to be invoked when all subscribed fields have been updated
 *
 *  @param streamCB pointer to callback function
 *  @param userdata pointer to private data to be passed back as argument to callback
 *  @return 0 if successful, error code otherwise
 */
__declspec(dllimport) int __stdcall set_stream_callback(
    STREAM_CALLBACK streamCB, void *userdata);

最佳答案

很好的例子,为什么需要足够的代码示例。

如果我正确解释了你的回调语法,

set_stream_callback(&streamCBWrapper, &mid);

streamCBWrapper设置为回调函数,而&mid是指向userdata的指针。

在回调中,您现在实际上是将一个指向 int 的指针转换为 MyClass,然后尝试访问非- 存在的对象。

确保将 MyClass 的实例传递给您的回调。我认为在您的情况下这将是this

关于c++ - 无法锁定 Qt 互斥锁 (QReadWriteLock) 访问冲突写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13361757/

相关文章:

c++ - Protocol Buffer 问题,多个序列化为二进制文件

c++ - VS2015从windows程序中删除linux上的文件

C++ 11 绑定(bind) std::function 与存储元组和解包

c++ - 如何在命令行中使用 MS 代码覆盖工具?

java - 如何将对象上的字段设置为 Final 以避免线程在同一对象上看到空引用?

java - Java 中的管道或交换输入/输出流

java - 如何使 Java Spring 组件类线程安全?

c++ - Qt widget 背景从 Linux 到 Windows 不同

c++ - 如何在不使用委托(delegate)的情况下在 QML 中显示模型数据

c++ - 使用指针访问 QVector 的元素