多线程访问共享内存的不加锁实现方式

多线程访问共享内存,为了实现同步,常采用加锁的方式。

那么,如何采用不加锁的方式来达到线程同步的目的呢?

思路:

保存两块共享内存,一块用于读操作,一块用于写操作。

初始时,两块共享内存内容一致。读操作均是读取第一块共享内存的数据;写操作均是写第二块共享内存。

在多个读操作一个写操作的情况下,读操作均从第一块共享内存读取,写操作修改第二块共享内存的数据。直至写操作完成,交换两块共享内存的下标,即第二块共享内存用于接下来的读操作,第一块共享内存根据第二块共享内存数据更新,用于接来下的写操作。

 

参考:

http://godorz.info/2010/05/synchronous-memory-access-for-multithread/

但是这个参考链接已经失效了,只是一种比较好的思路,因为在面试的时候被问到了这个问题,但没想到这种思路!

在Qt中,可以使用QSharedMemory类来实现多线程共享内存。下面是一个简单的示例代码,展示如何使用QSharedMemory类实现多线程共享内存: ```cpp #include <QtCore/QCoreApplication> #include <QtCore/QSharedMemory> #include <QtCore/QBuffer> #include <QtCore/QDebug> #include <QtCore/QThread> class SharedMemoryWriter : public QThread { public: void run() { QSharedMemory sharedMemory("MySharedMemory"); if (!sharedMemory.create(1024)) { qDebug() << "Unable to create shared memory segment."; return; } QBuffer buffer; buffer.open(QBuffer::ReadWrite); QDataStream out(&buffer); out << QString("Hello world!"); int size = buffer.size(); if (size > sharedMemory.size()) { qDebug() << "Unable to write to shared memory segment. Insufficient space."; return; } sharedMemory.lock(); char *to = (char*)sharedMemory.data(); const char *from = buffer.data().data(); memcpy(to, from, qMin(size, sharedMemory.size())); sharedMemory.unlock(); qDebug() << "Data written to shared memory segment."; } }; class SharedMemoryReader : public QThread { public: void run() { QSharedMemory sharedMemory("MySharedMemory"); if (!sharedMemory.attach()) { qDebug() << "Unable to attach to shared memory segment."; return; } QString message; QBuffer buffer; QDataStream in(&buffer); sharedMemory.lock(); buffer.setData((char*)sharedMemory.constData(), sharedMemory.size()); buffer.open(QBuffer::ReadWrite); in >> message; sharedMemory.unlock(); qDebug() << "Data read from shared memory segment:" << message; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); SharedMemoryWriter writer; SharedMemoryReader reader; writer.start(); writer.wait(); reader.start(); reader.wait(); return a.exec(); } ``` 上面的代码创建了两个线程,一个用于写入数据到共享内存中,另一个用于从共享内存中读取数据。在写入数据时,我们首先创建一个QBuffer对象,并将数据写入到该对象中。然后,我们检查共享内存的大小是否足够,如果足够,我们就将数据复制到共享内存中。在读取数据时,我们首先使用QSharedMemory类的attach()函数连接到共享内存,然后将共享内存中的数据复制到QBuffer对象中,并从中读取数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值