多线程开发之如何创建一个线程安全的类

​上一篇讨论了如何解决线程安全的问题,今天总结如何设计一个线程安全的类;

创建线程安全类的关注点

一个类要想线程安全,除了上一篇文章通过外部解决方式外,还可以通过合理的设计类的内部来解决,使类本身就线程安全,那么要怎么才能使类是线程安全的呢?

类不是线程安全的原因主要就是它包含了一些属性,这些属性是这个类实例对象的变量,这些变量影响着对象状态,由于对这些属性的访问在多线程情况下出现一些不安全使得对象状态并不符合预期导致类的不安全,所以设计线程安全类大概方向就是保证这些影响对象状态的变量,在Java并发编程实战中的总结如下:

找出构成对象状态的所有变量;

找出约束状态变量的不变性条件;

建立对象状态的并发访问管理策略;

这里先解释下不变性条件,在一些类的它的一些变量的变化是有一定规则的,比如类中定义一个属性表示苹果卖出了多少斤,卖出就增加,退货就减少,但是它肯定不会是一个负值,不为负值这就是这个变量的不变性条件。在比如类中定义了最大值与最小值,那么在这两个变量只有有一个不变性条件就是最大值要大于等于最小值。

简单解释了不变性条件再来理解下上面3条:可以把这3条分成3个步骤,首先是找出构成对象状态的所有变量,第二步是找出变量的约束条件,最后是上面两步找出的变量进行并发访问控制保证不变性条件的约束,对比较独立的属性直接进行并发访问,但是对有关联的那就必须要更多的机制保证这个约束。

所以我们可以把设计线程安全的类步骤分成以下三块:

1、找出所有需要同步的属性,保证不可变条件和后验条件(方法执行后必须为真的条件),

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你回答这个问题。 首先,在使用QT开发串口助手时,我们需要使用Qt的串口通信QSerialPort。该提供了许多函数,方便我们进行串口通信。在多线程开发中,我们需要使用QThread。 下面是一个简单的示例代码: ```cpp // 定义一个继承于QThread的 class SerialThread : public QThread { Q_OBJECT public: SerialThread(QObject *parent = nullptr); // 开始线程 void startThread(QString portName, int baudRate); signals: // 读取到数据的信号 void dataReceived(QByteArray data); protected: // 线程函数 void run() override; private: // 串口对象 QSerialPort *m_serialPort; }; SerialThread::SerialThread(QObject *parent) : QThread(parent) { m_serialPort = new QSerialPort(this); } void SerialThread::startThread(QString portName, int baudRate) { // 配置串口参数 m_serialPort->setPortName(portName); m_serialPort->setBaudRate(baudRate); m_serialPort->setDataBits(QSerialPort::Data8); m_serialPort->setParity(QSerialPort::NoParity); m_serialPort->setStopBits(QSerialPort::OneStop); m_serialPort->setFlowControl(QSerialPort::NoFlowControl); // 打开串口 if (!m_serialPort->open(QIODevice::ReadWrite)) { qDebug() << "Open SerialPort error"; return; } // 开始线程 start(); } void SerialThread::run() { while (m_serialPort->isOpen()) { // 读取数据 QByteArray data = m_serialPort->readAll(); // 发送读取到的数据信号 emit dataReceived(data); } } ``` 在主线程中,我们可以这样使用: ```cpp // 创建线程对象 SerialThread *thread = new SerialThread(this); // 连接信号和槽函数 connect(thread, &SerialThread::dataReceived, this, [=](QByteArray data) { // 处理读取到的数据 }); // 启动线程 thread->startThread("COM1", 115200); ``` 这里只是一个简单的示例代码,实际使用时还需要加上一些错误处理等代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值