day06

回顾:
1 CREATE TABLE 表名 (列名 类型[约束],...,...);
2 DROP TABLE 表名;
3 INSERT INTO 表名 (列名,...) VALUES(数值,...);
4 DELETE FROM 表名 WHERE 条件;
5 UPDATE 表名 SET 列名=数值,... WHERE 条件;
6 SELECT 列名 FROM 表名  
    WHERE 条件  
        ORDER BY 列名  ASC/DESC;
=========
今天:
回顾:
pthread_create
pthread_join
pthread_detach
pthread_cancel
 
 
 
一 QT多线程
#include <QThread>
创建线程方法1://不推荐
class Worker : public QObject
{
    Q_OBJECT
public slots:
    void doWork(const QString &parameter) {
        QString result;
        /* 耗时或可能阻塞操作 */
    }
};
 
class Controller : public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    Controller() {
        Worker *worker = new Worker;
        worker->moveToThread(&workerThread);
        //当发送operate信号时,Worker::doWork将被放到线程中执行
    connect(this, &Controller::operate,  
        worker, &Worker::doWork);
        workerThread.start();
    }
    ~Controller() {
        workerThread.quit();
        workerThread.wait();
    }
};
 
创建线程方法2:推荐使用该方法
--》继承QThread
--》重写run函数
class WorkerThread : public QThread
{
    Q_OBJECT
    void run(void){//线程入口函数
        /* 耗时或者可能阻塞代码 */
    }
};
void MyObject::startWorkInAThread()
{
    WorkerThread *workerThread  
    = new WorkerThread(this);
    //开启线程,WorkerThread::run将在独立线程中被执行
    workerThread->start();
}
 
相关的函数
1)线程阻塞
bool QThread::wait(unsigned long time = ULONG_MAX)
2)线程终止
void QThread::terminate()
3)开启线程
void start();
4)获取当前线程句柄(ID)
QThread::currentThreadId()
 
《案例》多线程打印消息
 
========================
二 QT线程同步
1 互斥量 QMutex
eg:
QMutex mutex;
int g_data = 0;
void ThreadA::run(){
    mutex.lock();
    g_data = g_data + 1;
    mutex.unlock();
}
void ThreadB::run(){   
    mutex.lock();
    g_data = g_data + 1;
    mutex.unlock();
}
 
2 读写锁 QReadWriteLock
eg:
int g_data = 0;
QReadWriteLock lock
void readerThread::run()
{  
   ..
   lock.lockForRead();
   accesc_data_without_modify(&g_data);
   lock.unlocked();
}
void WriterThread::run()
{  
   ..
   lock.lockForWrite();
   modify_data(&g_data);
   lock.unlocked();
}
 
3 信号量 QSemaphore
QSemaphore sema(1)  ==> QMutex mutex;
sema.acquire()      ==> mutex.lock();
sema.release()      ==> mutex.lock();
 
《生产者和消费者》
P操作:申请资源,将信号量S的值减1,S=S-1;
       如果S>=0,该线程继续执行;否则进入等待
 
V操作:释放资源,将信号量S的值加1,S=S+1;
       如果S<=0,说明有线程在等待,则唤醒等待的线程
问题:
1)生产者向仓库存数据,但是如果生产者速度太快,那么会把消费者还未读走的数据覆盖。
2)消费者从仓库取数据,但是如果消费者速度太快,那么将会越过生产者读到一些垃圾数据。
 
解决:使用两个信号
控制生产者信号量(freeSpace),如果仓库满则阻塞;
控制消费者信号量(usedSpace),如果仓库为空则阻塞
 
 
生产者线程:
while(1){
   P(freeSpace)
   生产一个产品,存放到仓库
   V(usedSpac)
}
 
消费者线程:
while(1){
   P(usedSpace)
   从仓库取出一个数据消费
   V(freeSpace)
}
 
4 条件等待 QWaitCondition
 
练习1:使用QWaitCondition,重构生产者消费者案例
练习2:复习linux网络编程
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值