笔记9.9

  1. Qt中如何实现多线程(确保程序的不同部分能够按照预期的方式协作),避免数据竞争与不一致。
  • 互斥锁-mutex
    QMutex mutex;
    mutex.lock(); // 获取锁
    // 临界区
    mutex.unlock(); // 释放锁
  • 信号与槽-signals and slots
    // 在一个线程中
    QObject::connect(&threadWorker, &ThreadWorker::finished, this, &MainWindow::onFinished);
    
    // 在线程的工作类中
    void ThreadWorker::doWork()
    {
        // ...
        emit finished();
    }

  • 条件变量(condition variables)条件变量通常与互斥量一起使用,允许一个或多个线程等待某个特定条件成立。
    QMutex mutex;
    QWaitCondition cond;
    mutex.lock();
    while (!conditionIsTrue) {
        cond.wait(&mutex); // 释放锁并等待
    }
    // 条件满足后执行的操作
    mutex.unlock();

  • 原子操作(atomic operations)原子操作是一组可以保证读-改-写操作不会被其他线程干扰的方法。这些方法对于简单的数据类型特别有用。
    int value = 0;
    QAtomicInt atomicValue = value;
    atomicValue.fetchAndAddRelaxed(1);

  • QSemaphore信号量是一个计数器,用于控制同时访问特定资源的线程数量。
    QSemaphore sem(1);
    sem.acquire(); // 减少可用许可的数量
    // 临界区
    sem.release(); // 增加可用许可的数量

  • QReadWriteLock 读写锁允许多个线程同时读取共享资源,但是写入的时候需要独占访问。
QReadWriteLock lock(QReadWriteLock::Recursive);
lock.lockForRead(); // 获取读取锁
// 读取操作
lock.unlock(); // 释放读取锁
  • 事件循环(Event Loops)Qt的事件循环也可以用于实现线程同步。通过使用QEventLoop,你可以暂停当前线程直到某个条件满足

在使用上述任何一种技术时,请确保正确地处理异常情况,并且始终记得在不再需要锁定的情况下解锁,以避免死锁。在Qt中进行线程编程时,还应该注意不要直接在非GUI线程中访问或修改Qt的GUI组件,因为这可能会导致不稳定的行为或崩溃

  1. c++中
  • 死锁:确保互斥量和条件变量正确使用,避免死锁。
  • 异常安全:处理可能抛出异常的情况,确保资源被正确释放。
    线程局部存储:使用std::thread::get_id()和std::this_thread::get_id()来识别线程,可以用来实现线程局部存储。
    线程同步的粒度:尽量减少锁的持有时间,只在必要时锁定关键区域。

c++中如何操作内存

  •  分配内存--使用new运算符,如果分配失败就会抛出       std::bad_alloc();

    int *p=new int;//分配一个int大小的空间
    
    
    //使用new[] 分配连续的内存块
    int *p[10]=new int[10];//分配10个int大小的空间
  •  释放内存--使用delete运算符
    delete p;
    
    delete[] array;

  • 内存管理类与智能指针
  • 使用智能指针(std::unique_ptr,std::shared_ptr)可以自动管理内存生命周期,避免内存泄漏
    std::unique_ptr<int> up(new int);//独占所有权
    std::shared_ptr<int> sp1(new int);//共享所有权

  •  使用容器(std::vector,std::array)这些容器会在内部处理内存分配和释放。
  • 通过指针访问修改内存
  •  内存安全

  • 避免使用未初始化的内存,因为它们可能包含任意值。
  • 确保所有内存都被正确释放,以避免内存泄漏。
  • 不要重复释放内存,这会导致程序崩溃或行为不确定。
  • 对于动态分配的内存,始终检查是否成功分配。

某些情况下可能需要使用C语言风格的内存函数,如malloc()和free()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值