vue:上傳(改變)圖片
阿新 • • 發佈:2021-01-06
技術標籤: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; }