lesson15-QT マルチスレッド
1. スレッドとは
1. スレッド
プロセス: リソース割り当ての最小単位である実行プログラム
スレッド: プログラム実行の最小単位
プロセスには多くの欠点がありますまず、プロセスがリソース所有者であるため、作成、キャンセル、切り替えに大きな時間とスペースのオーバーヘッドが発生するため、軽量プロセスを導入する必要があります。次に、対称型マルチプロセッサ (SMP) の出現により、複数のオペレーティングユニットと複数のプロセスを満たす 並列オーバーヘッドが高すぎます。
2. スレッド
同時実行性とは、同時に実行できる命令は 1 つだけですが、複数のプロセス命令が高速にローテーションして実行され、複数のプロセスが同時に実行されるというマクロ効果を与えることを意味します。
同時に起こっているようです
並列とは、複数の命令が複数のプロセッサ上で同時に実行されることを意味します。
真の同時発生
同期: 相互に依存する呼び出しは「同時に発生」すべきではなく、同期はそれらの「同時に発生」を防ぐことです
非同期の概念は同期の反対です。互いに独立した 2 つの操作は非同期であり、物事が独立して実行されることを示します
3. マルチプロセッサーでのプログラム開発の並列性
2)。他の操作を実行し、同時実行性を向上させることができます
3)、モジュール型プログラミングはプログラム内の独立したイベント間の関係をより明確に表現でき、構造が明確です
4)、占有するシステム リソースが少なくなります
マルチスレッドは必ずしも複数を必要とするわけではありませんプロセッサ
これは GUI プログラムでよく見られます。マルチスレッド技術を使用すると、1 つのスレッドがインターフェイスに応答するために使用され、他のスレッドはバックグラウンドで長時間の操作を処理できます。Qt のメタオブジェクト システムは、シグナルを使用して通信するためのさまざまなスレッドのオブジェクトをサポートします。 2. QT のその他のスレッド
Qt でマルチスレッドを使用するのは非常に簡単です。 QThread には保護された型の run 関数があり、これを書き換えることでマルチスレッドを実現できます。
1. QT スレッド
Qt でマルチスレッドを使用するのは非常に簡単です。QThread をサブクラス化し、run 関数を書き換えてマルチスレッドを実現します
class MyThread:public Thread
{
public:
MyThread();
protected:
void run();
private:
volatile boolean stop;
}
run 関数は、スレッドの start メソッドを通じて開始され、スレッドが実行中かどうかを判断する isRunning メソッドも備えています。 thread
2 、スレッド同期セマフォ
セマフォは、スレッドがビジー状態で待機するのを防ぎ、mutex の拡張です。セマフォを使用すると、2 つの重要なコードが同時に実行されないようにすることができます。コードの重要なセクションに入るとき、スレッドはセマフォを取得し、終了時にセマフォを解放する必要があります。セマフォは複数のスレッドから同時にアクセスできます。
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.wait(&mutex)
condition.wakeAll()
wait 関数はミューテックスのロックを解除し、ここで待機します。この関数が戻る前に再ロックされます。
wakeAll 関数は、ミューテックスを待機しているすべてのスレッドを起動します
4. スレッドの優先順位
実際のタスクでは、特定のスレッドが最初に実行される場合があるため、スレッドの優先順位を設定する必要があります。
setPriority 関数は、スレッドの優先度を設定するか、スレッドの開始時に start 関数にスレッドの優先度を渡すことができます
3. 例
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>
http://www.bkjia.com/PHPjc/1103190.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/1103190.html技術記事 lesson15-QT マルチスレッド 1. スレッドとは 1. スレッドプロセス: リソース割り当ての最小単位である実行中のプログラム スレッド: プログラム実行の最小単位が登場します...。