首页 > php教程 > php手册 > 正文

lesson15-QT多线程

php中文网
发布: 2016-06-13 08:45:38
原创
1419人浏览过

ProcessOn
ProcessOn

免费在线流程图思维导图,专业强大的作图工具,支持多人实时在线协作

ProcessOn 886
查看详情 ProcessOn

lesson15-qt多线程

一、什么是线程
1、线程
进程:一个正在执行的程序,它是资源分配的最小单位
线程:程序执行的最小单位

进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(smp)出现,可以满足多个运行单位,而多个进程并行开销过大。

2、线程的术语
并发是指在同一时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。
看起来同时发生

并行是指在同一时刻,有多条指令在多个处理器上同时执行。
真正的同时发生

同步:彼此有依赖关系的调用不应该“同时发生”,而同步就是要阻止那些“同时发生”的事情
异步的概念和同步相对,任何两个彼此独立的操作是异步的,它表明事情独立的发生

3、线程的优势
1)、在多处理器中开发程序的并行性
2)、在等待慢速io操作时,程序可以执行其他操作,提高并发性
3)、模块化的编程,能更清晰的表达程序中独立事件的关系,结构清晰
4)、占用较少的系统资源

多线程不一定要多处理器
gui程序中经常会使用多线程技术,一个线程用来响应界面,而其他线程就可以在后台处理冗长的操作
qt的元对象系统支持不同线程中的对象使用信号和槽机制通信




二、qt多线程
qt中使用多线程是非常简单的,只要子类话qthread就可以了,在qthread中有一个protected类型的run函数,重写run函数就可以实现多线程。
1、qt线程
qt中使用多线程是非常简单的,只要子类化qthread,然后重写run函数就可以实现多线程

class mythread:public thread
{
public:
mythread();
protected:
void run();
private:
volatile boolean stopped;
}

run函数是通过线程的start方法启动的,线程还有isrunning方法来判断是否在运行,terminate方法结束线程


2、线程同步之信号量
信号量使线程不需要忙碌的等待,是对mutex的一种扩展。使用信号量可以保证两个关键代码不会并发。在进入一段关键代码时,线程必须获取信号量,退出时必须释放。信号量可以同时由多个线程访问。

qt的信号量qsemaphore类:
acquire()用来获取资源,free()用来释放资源

生产者和消费者的例子,生产者生产的时候需要确保有足够的空间,消费者消费的时候要确保空间里有资源
qsemaphore freebyte(100) 生产有有100个空间
qsemaphore usebyte(0)消费者没有资源
producer
{
freebyte.acquire()
byte = n
usebyte.release()
}
consumer
{
usebyte.acquire()
printf byte
freebyte.release()
}


3、线程同步之条件变量
qwaitcondition允许线程在一定条件下唤醒其他的线程,这样也可以是线程不必忙碌的等待,条件变量要配合互斥量来使用

qmutex mutex; qwaitcondition condition;
condition.wait(&mutex)
condition.wakeall()
wait函数将互斥量解锁,并在此等待,此函数返回之前会将互斥量重新枷锁。
wakeall函数会将所有等待该互斥量的线程唤醒


4、线程优先级
实际任务可能会让某个线程先运行,那么就需要设置线程优先级。
setpriority函数可以设置线程的优先级,或者在线程启动的时候在start函数传入线程的优先级


三、实例
1、多线程
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#ifndef mythread_h<br /> </li><li>#define mythread_h<br /></li><li><br /></li><li>#include <qthread><br /></li><li><br /></li><li>class mythread : public qthread<br /></li><li>{<br /></li><li>q_object<br /></li><li>public:<br /></li><li>mythread();<br /></li><li>void stop();<br /></li><li>volatile bool stopped;<br /></li><li>protected:<br /></li><li>void run();<br /></li><li>};<br /></li><li>#endif</li></ol>
登录后复制
<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#include "mythread.h"<br /> </li><li>#include <qtdebug><br /></li><li><br /></li><li>mythread::mythread()<br /></li><li>{<br /></li><li>stopped = false;<br /></li><li>}<br /></li><li><br /></li><li>void mythread::run()<br /></li><li>{<br /></li><li>int i=0;<br /></li><li>while(!stopped)<br /></li><li>{<br /></li><li>qdebug()<<"thread id:"<qthread::currentthreadid()<<":"<<i;<br /></li><li>i++;<br /></li><li>sleep(2);<br /></li><li>}<br /></li><li>stopped = false;<br /></li><li>}<br /></li><li><br /></li><li>void mythread::stop()<br /></li><li>{<br /></li><li>stopped = true;<br /></li><li>} </li></ol>
登录后复制

2、信号量

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#ifndef producer_h<br /> </li><li>#define producer_h<br /></li><li><br /></li><li>#include <qthread><br /></li><li><br /></li><li>class producer : public qthread<br /></li><li>{<br /></li><li>q_object<br /></li><li>public:<br /></li><li>producer();<br /></li><li>protected:<br /></li><li>void run();<br /></li><li>};<br /></li><li><br /></li><li>#endif</li></ol>
登录后复制

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#ifndef consumer_h<br /> </li><li>#define consumer_h<br /></li><li><br /></li><li>#include <qthread><br /></li><li><br /></li><li>class consumer : public qthread<br /></li><li>{<br /></li><li>q_object<br /></li><li>public:<br /></li><li>consumer();<br /></li><li>protected:<br /></li><li>void run();<br /></li><li>};<br /></li><li><br /></li><li>#endif</li></ol>
登录后复制

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#include "producer.h"<br /> </li><li>#include "consumer.h"<br /></li><li>#include <qdebug><br /></li><li>#include <qsemaphore><br /></li><li><br /></li><li>#define size 50<br /></li><li>qsemaphore freebyte(size);<br /></li><li>qsemaphore usebyte(0);<br /></li><li><br /></li><li>producer::producer()<br /></li><li>{<br /></li><li><br /></li><li>}<br /></li><li>void producer::run()<br /></li><li>{<br /></li><li>for(int i=0; i<size; i++)<br /></li><li>{<br /></li><li>freebyte.acquire();<br /></li><li>qdebug()<<"produer:"<<i;<br /></li><li>usebyte.release();<br /></li><li>sleep(1);<br /></li><li>}<br /></li><li>}<br /></li><li>consumer::consumer()<br /></li><li>{<br /></li><li><br /></li><li>}<br /></li><li>void consumer::run()<br /></li><li>{<br /></li><li>for(int i=0; i<size; i++)<br /></li><li>{<br /></li><li>usebyte.acquire();<br /></li><li>qdebug()<<"consumer:"<<i;<br /></li><li>freebyte.release();<br /></li><li>sleep(2);<br /></li><li>}<br /></li><li>} </li></ol>
登录后复制


3、条件变量

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#ifndef thread_h<br /> </li><li>#define thread_h<br /></li><li><br /></li><li>#include<qthread><br /></li><li><br /></li><li>class producer : public qthread<br /></li><li>{<br /></li><li>q_object<br /></li><li>public:<br /></li><li>producer();<br /></li><li>protected:<br /></li><li>void run();<br /></li><li>};<br /></li><li><br /></li><li>class consumer : public qthread<br /></li><li>{<br /></li><li>q_object<br /></li><li>public:<br /></li><li>consumer();<br /></li><li>protected:<br /></li><li>void run();<br /></li><li>};<br /></li><li><br /></li><li>#endif</li></ol>
登录后复制

<ol style="margin:0 1px 0 0px;padding-left:40px;" start="1" class="dp-css"><li>#include "thread.h"<br /> </li><li>#include <qdebug><br /></li><li>#include <qmutex><br /></li><li>#include <qwaitcondition><br /></li><li><br /></li><li>qmutex mutex;<br /></li><li>qwaitcondition empty, full;<br /></li><li>int num=0;<br /></li><li>int buffer[50];<br /></li><li>int usebyte=0;<br /></li><li><br /></li><li><br /></li><li>producer::producer()<br /></li><li>{<br /></li><li><br /></li><li>}<br /></li><li>void producer::run()<br /></li><li>{<br /></li><li>for(int i=0; i<50; i++)<br /></li><li>{<br /></li><li>mutex.lock();<br /></li><li>if(usebyte==50)<br /></li><li>empty.wait(&mutex);<br /></li><li>num++;<br /></li><li>buffer[i] = num;<br /></li><li>qdebug()<<"producer:"<<num;<br /></li><li>usebyte++;<br /></li><li>full.wakeall();<br /></li><li>mutex.unlock();<br /></li><li>sleep(1);<br /></li><li>}<br /></li><li>}<br /></li><li>consumer::consumer()<br /></li><li>{<br /></li><li><br /></li><li>}<br /></li><li>void consumer::run()<br /></li><li>{<br /></li><li>for(int i=0; i<50; i++)<br /></li><li>{<br /></li><li>mutex.lock();<br /></li><li>if(usebyte==0)<br /></li><li>full.wait(&mutex);<br /></li><li>qdebug()<<"consumer"<<buffer[i];<br /></li><li>usebyte--;<br /></li><li>empty.wakeall();<br /></li><li>mutex.unlock();<br /></li><li>sleep(2);<br /></li><li>}<br /></li><li>} </li></ol>
登录后复制



相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号