1. 程式人生 > >qt執行緒同步之訊號量

qt執行緒同步之訊號量

#include <QApplication>
#include <QMutex>
#include <QThread>
#include <QSemaphore>
#include <QMutexLocker>
#include <QReadWriteLock>
#include <iostream>

using namespace std;

const int DATA_SIZE = 100;
const int BUF_SIZE = 10;
int buf[BUF_SIZE] = {0};

QMutex mutex;// 控制執行緒間的互斥

/********freeSpace和useSpace控制執行緒間的同步********/

// 控制可被生產者填充資料的那部分緩衝區
QSemaphore freeSpace(BUF_SIZE);// 程式開始啟動時,生產者會有BUF_SIZE個空間生產資料

// 控制可被消費者讀取資料的那部分緩衝區
QSemaphore useSpace(0);// 程式開始啟動時,消費者會有0個空間取資料


class CProducer : public QThread
{
protected:
    virtual void run()
    {
        for (int i = 0 ; i < DATA_SIZE ; ++i)
        {
            freeSpace.acquire();// 當前訊號量是否有可以填充資料的緩衝區,如果資源計數為0,則沒有可以填充的緩衝區,那麼該函式會阻塞當前執行緒
            {
                QMutexLocker locker(&mutex);

                buf[i%BUF_SIZE] = qrand() % 50 + 1;
                cout << "produce data is :" << buf[i%BUF_SIZE] << endl;
            }
            useSpace.release();// 使useSpace物件的資源計數加1,此時消費者執行緒就有機會取資料了
        }
    }
};

class CConsumer : public QThread
{
protected:
    virtual void run()
    {
        for (int i = 0 ; i < DATA_SIZE ; ++i)
        {
            useSpace.acquire();// 當前訊號量是否有可以取資料的緩衝區,如果資源計數為0,則沒有可取的緩衝區,那麼該函式會阻塞當前執行緒
            {
                QMutexLocker locker(&mutex);

                int nData = buf[i%BUF_SIZE];
                cout << "consume data is: " << nData << endl;
            }
            freeSpace.release();// 使freeSpace物件的資源計數加1,此時生產者執行緒就有機會生產資料了
        }
    }
};


int main(int argc, char *argv[])
{
    CProducer producer;
    CConsumer consumer;

    producer.start();
    consumer.start();

    producer.wait();
    consumer.wait();

    return 0;
}

相關推薦

qt執行同步訊號

#include <QApplication> #include <QMutex> #include <QThread> #include <QSemaphore> #include <QMutexLocker>

Python並行程式設計(五):執行同步訊號

1、基本概念       訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是一個內部資料,用於標明當前的共享資源可以有多少併發讀取。       同樣在threading中,訊號量有acquire和release兩個函式。       - 每當執行緒想要讀取關聯

19.執行同步訊號—>[單生產者/單消費者]單鏈表的插入和刪除

1.訊號量 1.訊號量本質 訊號量是鎖,是一種升級的mutex 訊號量在初始化時,可以指定共享資源的數量 2.相關函式 #include<semaphore.h> //標頭檔案 sem_t sem; //訊號量型別 int sem_destroy(se

Linux 學習筆記—執行同步互斥與條件變數

執行緒同步(同步的意思是協同步調) 執行緒同步機制包括互斥,讀寫鎖以及條件變數等 3.2.1 互斥量(互斥鎖) **互斥量本質是一把鎖,在訪問公共資源前對互斥量設定(加鎖),確保同一時間只有一個執行緒訪問資料,在訪問完成後再釋放(解鎖)互斥量。**在互斥量加鎖之

qt執行同步條件等待

本文章使用QWaitCondition實現執行緒間的同步 #include <QApplication> #include <QMutex> #include <QThread> #include <QSemaphore> #

執行同步3 ------ 訊號實現程序或者執行之間的同步

基本概念       首先要注意,訊號量和訊號是完全兩碼事。訊號量是一個計數器,常用於處理程序或執行緒的同步問題,特別是對臨界資源訪問的同步。臨界資源可以簡單地理解為在某一時刻只能由一個程序或執行緒進行操作的資源。通常,程式對共享資源的訪問的程式碼只是很短的一段,但就是這一

C++多執行同步Semaphore(訊號)

一、執行緒間同步的幾種方式 從上篇博文中可以發現,當多個執行緒對同一資源進行使用時,會產生“爭奪”的情況,為了避免這種情況的產生,也就出現了執行緒間的同步這個技術。執行緒間的同步有多種方式,在接下來的博文中我會依次介紹幾種主流的同步方式,以及他們之間的區別。在

python執行鎖與訊號

執行緒鎖(互斥鎖Mutex) 一個程序下可以啟動多個執行緒,多個執行緒共享父程序的記憶體空間,也就意味著每個執行緒可以訪問同一份資料,此時,如果2個執行緒同時要修改同一份資料,會出現什麼狀況?就會可能存在同時取出了一個數據進行操作,然後存回去,這樣就會丟失一次操作。所以用鎖,在修改之前鎖上資料,

C++多執行同步Mutex(互斥)

一、互斥量Mutex同步多執行緒 1、Win32平臺 相關函式和標頭檔案 #include <windows.h> HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes

【Windows】執行漫談——.NET執行同步Interlocked和ReadWrite鎖

摘要: 本系列意在記錄Windwos執行緒的相關知識點,包括執行緒基礎、執行緒排程、執行緒同步、TLS、執行緒池等。 這篇來說說靜態的Interlocked類和ReadWrite鎖 .NET中的Interlock

併發程式設計-初始執行-同步lock 時間:2018/10/27

執行緒同步的方法之lock 先看一個簡單的例子 namespace _005程序同步lock { class Program { static int val1 = 0; //兩個執行緒都操作的一個靜態變數 static void Main(

python多執行————6、執行同步Semaphore

控制程式碼進入執行緒的數量,控制併發數量,可以使用訊號量Semaphore。 1、定義訊號量sem  =  threading.Semaphore(3)  #3為併發數量 2、消耗訊號量 sem.acquire() 3、釋放訊號量 sem.release()

pyhon多執行——5、執行同步condition

如何使用多執行緒實現一問一答呢?可以使用condition中的notify和wait方法實現,看程式碼 import threading import time class XiaoAi(threading.Thread): def __init__(self,cond):

python多執行————4、執行同步Lock,RLock

     在多執行緒同時請求同一個資源並進行修改時可能會造成結果出錯,例如共享變數       from dis import dis import threading a = 0 def add(): global a

window下執行同步(Critical Sections(關鍵程式碼段、關鍵區域、臨界區域)----轉載

轉載:https://www.cnblogs.com/cyblogs/p/9948379.html    關鍵區域(CriticalSection) 臨界區是為了確保同一個程式碼片段在同一時間只能被一個執行緒訪問,與原子鎖不同的是臨界區是多條指令的鎖定,而原子

Springboot 執行同步Semaphore 資源包的簡單使用

如果你有一個東西, 你想別人觸碰它的時候,不能同時觸碰,需要按照你想要的每次多少人來觸碰。 算了,不做比喻了,程式碼原理其實也簡單,我們直接先看程式碼,我再做簡單的解釋(估計不用看解釋也能懂): package com.semaphore.controller; import org.sp

Linux執行同步條件變數pthread_cond_t

Linux執行緒同步之條件變數pthread_cond_t  一直以來都天真的認為執行緒間同步的方法只有訊號量,互斥量,郵箱,訊息佇列,知道最近開始研究一些Linux方面的程式碼才發現自己是多麼的很傻很天真。在Linux中還存在這一種叫做條件變數的東西。必須承認我在理解這個概念上花了很

執行同步——兩個執行序列順序列印奇數和偶數的兩種實現

題目:一道經典的執行緒併發的問題,執行緒a列印1、3、5……,執行緒b列印2、4、6……,兩個執行緒交替執行輸出1、2、3、4、5、6…… 要點: package com.test; import java.util.concurrent.locks.

Python並行程式設計(七):執行同步事件

1、基本概念       事件是執行緒之間用於通訊的物件。有的執行緒等待訊號,有的執行緒發出訊號。基本上事件物件都會維護一個內部變數,可以通過set方法設定為true,也可以通過clear方法設定為false。wait方法將會阻塞執行緒,直到內部變數為true。 2、使用用例 # coding : utf

Linux 學習筆記—執行同步讀寫鎖、自旋鎖、屏障

3.2.1 讀寫鎖 讀寫鎖和互斥體類似,不過讀寫鎖有更高的並行性,互斥體要麼是鎖住狀態,要麼是不加鎖狀態,而且一次只有一個執行緒可以對其加鎖。而讀寫鎖可以有3個狀態,讀模式下鎖住狀態,寫模式下鎖住狀態,不加鎖狀態。一次只有一個執行緒可以佔有寫模式的讀寫鎖,但是多