C++11 多線程框架、線程鎖、等待條件、雙緩沖的使用


做過相關工程很久了,沒有記錄,發現有些忘記了,又復習了一遍,這里記錄下:

我這里的代碼做過刪減,直接運行不了,重點在於說明thread創建框架、鎖的使用、條件等待以及雙緩沖的使用!

#include <stdio.h>
#include <iostream>
//thread
#include "thread"
#include "mutex"
#include <condition_variable>

struct Content 
{
   char img_data[1843200];
};

// Forward function definitions:
using namespace cv;
using namespace std;
bool sendimg = false;
void get_img();//線程1函數
void detect_trafficcone(int argc, char** argv); //線程2函數
void get_imginfo(pair<Mat,string>& info);
pair<Mat,string> g_imginfo;//緩存1 
pair<Mat,string> g_imginfoT;//緩存2
mutex mutex_imginfo;//mutex鎖
condition_variable cond_imginfo;//條件變量
bool g_imginfo_flag = false;//信號量
string g_send_img = "name=detector5;timestamp=";
bool g_send_flag = false;
mutex mutex_send_img;
condition_variable cond_send_img;

int main(int argc, char** argv)
{
    thread getframe(get_img);//起線程1
    sleep(3);
    thread getobjinfo(detect_trafficcone,argc, argv);//起線程2
    getobjinfo.join();//.join是等待式結束,上面運行完畢才結束線程
    getframe.join();
    return 0;
}

void get_imginfo(pair<Mat,string>& info)
{
  //雙緩沖交換數據 g_imginfoT
= info; info = g_imginfo; g_imginfo = g_imginfoT; } void detect_trafficcone(int argc, char** argv) { while(true) { pair<Mat,string> imginfo; unique_lock<mutex> lock_imginfo(mutex_imginfo); while(!g_imginfo_flag) { cond_imginfo.wait(lock_imginfo);//等待cond_imginfo條件提醒,接收到提醒後先上鎖,然后檢查個g_imginfo_flag是否滿足條件,滿足就向下進行,不滿足解鎖。 } get_imginfo(imginfo); g_imginfo_flag = false; lock_imginfo.unlock(); Mat recv_img = imginfo.first; string timestamp = imginfo.second; cout<<"detect trafficcone ..."<<endl; imshow("recv_img",recv_img); waitKey(0); send_img = send_img + "trafficcone_num="+to_string(box_num)+posboxs; unique_lock<mutex> lock_send_img(mutex_send_img);//unique_lock互斥鎖,管理mutex的工具,此時對mutex_send_img加鎖 g_send_img = send_img; g_send_flag = true; lock_send_img.unlock();//解鎖,省略不寫的話,該函數運行結束自動解鎖 cond_send_img.notify_all();//條件提醒 cout<<"send_img:"<<send_img<<endl; } } void get_img() { while(true) { unique_lock<mutex> lock_imginfo(mutex_imginfo); g_imginfo.first = recv_img; g_imginfo.second = timestamp; g_imginfo_flag = true; lock_imginfo.unlock(); cond_imginfo.notify_all(); unique_lock<mutex> lock_send_img(mutex_send_img); while(!g_send_flag) { cond_send_img.wait(lock_send_img); } zmq::message_t req_message(strlen(g_send_img.c_str())); memcpy((void*)req_message.data(),g_send_img.c_str(), strlen(g_send_img.c_str())); REQsocket.send(req_message); g_send_flag = false; lock_send_img.unlock(); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM