1. 程式人生 > 其它 >vue:上傳(改變)圖片

vue:上傳(改變)圖片

技術標籤:C++

一、多執行緒基本操作

std::thread, join, detach

二、鎖:防止多執行緒競爭

std::mutex: 如果執行緒判斷mutex已經為lock狀態,則無法執行後續程式碼;

std::vector<cv::Mat> buf;
thread1(){
    std::mutex mutex_;
    mutex_.lock();
    buf.push_back(img);
    mutex_unlock();
};

std::lock_guard對std::mutex做了封裝,通過物件生命週期管理mutex,lock_guard被銷燬時鎖自動釋放,防止mutex在核心區域內return等造成mutex無法釋放。

std::vector<cv::Mat> buf;
thread1(){
    {
    std::lock_guard<std::mutex> lck(mutex_);
    buf.push_back(img);
    }
};

std::unique_lock 相比於std::lock_guard有更多操作。

std::vector<cv::Mat> buf;
thread1(){
    {
    std::unique_lock<std::mutex> lck(mutex_);
    buf.push_back(img);
    }
};

三、多執行緒控制

condition_variable: 多執行緒通訊和控制,可以阻塞一個或同時阻塞多個執行緒。std::condition_variable需要與std::unique_lock配合使用。呼叫condition_variable的wait方法時阻塞執行緒,並釋放鎖,使得其他執行的執行緒可以訪問臨界區;直到收到其他執行緒notify喚醒時,再次lock鎖,並繼續執行。

生產-消費模型:

class ProducerConsumerModel{
public:
void producer(){
    while(true){
        std::unique_lock<std::mutex> lck(mutex_);
        while(cargo!=0) produce.wait(lck);
        cargo=1;
        buf.push_back(i);
        i++;
        consume.notify_one();
    }
}

bool consumer(){
    while(true){
        std::unique_lock<std::mutex> lck(mutex_);
        while(cargo==0) consume.wait(lck);
        buf.pop_front();
        cargo=0;
        produce.notify_one(img);
        return true;
    }
}

private:
std::deque<int> buf;  //需要被保護的物件,多程序中可能帶來競爭;
std::mutex  mutex_;  //在多執行緒中用來做資料保護,保護buf;
int cargo=0;  //用來判斷執行緒組合和喚醒的條件,使用全域性變數或成員變數線上程間傳遞資訊;
std::condition_variable consume, produce; //(根據cargo的條件)用來控制執行緒阻塞和喚醒;(condition_variable需要與std::unique_lock配合使用,unique_lock對mutex進行了淺層封裝)

int i=0;
};

int main(int argc, char **argv){
    ProducerConsumerModel prdcnsmodel;
    std::thread threads[2];
    threads[0]=std::thread(&ProducerConsumerModel::producer, &prdcnsmodel);
    threads[1]=std::thread(&ProducerConsumerModel::consumer,&prdcnsmodel);
    for(auto &t:threads){
        t.join();
    }
    return 0;
}