c++多线程队列

举报
风吹稻花香 发表于 2021/06/04 23:08:19 2021/06/04
【摘要】 多线程中,使用队列不需要锁也能运行,取得时候先判断一下长度,长度为0线Sleep(3)。   struct RevData{ int size; char data[1000]; } recv_data;  #include <iostream> #include <queue> #include<m...

多线程中,使用队列不需要锁也能运行,取得时候先判断一下长度,长度为0线Sleep(3)。

 


  
  1. struct RevData{
  2. int size;
  3. char data[1000];
  4. } recv_data;
  5.  
  6. #include <iostream>
  7. #include <queue>
  8. #include<map>
  9. #include <string>
  10. #include <mutex>
  11. //#include <Windows.h>
  12.  
  13. using namespace std;
  14. queue<RevData*> queue1;
  15. queue<RevData*>* queue2;
  16. //queue2 = (queue<RevData*>*)malloc(sizeof(queue<RevData*>));
  17.  
  18. for (int i = 0; i < 10; i++) {
  19. RevData recvD;
  20. recvD.size = i;
  21. strcpy(recvD.data, "hello");
  22. RevData* recvp = (RevData*)malloc(sizeof(RevData));
  23. memcpy(recvp, &recvD, sizeof(RevData));
  24. queue1.push(recvp);// recvp);
  25. //queue1.push(&recvD);
  26. }
  27.  
  28. queue2 = &queue1;
  29. for (int i = 0; i < 10; i++) {
  30. RevData* recv = queue2->front();
  31. cout << (*recv).data << endl;
  32.  
  33. int lenga = queue2->size();
  34. queue2->pop();
  35. int lenga2 = queue2->size();
  36. cout << (*recv).size << endl;
  37. }

 

例子:

struct RevData {

    int cam_id;

    cv::Mat  image;

} recv_data;

 

线程调用:

thread video_thread1(bind(&play_url, v_url));
    thread video_thread2(bind(&detect_thread));

    video_thread1.join();

int play_url(char* url){

}

 

get队列:


  
  1. while (1) {
  2. cv::Mat origin_image;//定义一个变量把视频源一帧一帧显示
  3. //capture >> origin_image;
  4. //if (origin_image.empty())
  5. //{
  6. // std::cout << "no video frame" << std::endl;
  7. // break;
  8. //}
  9. bool is_get = FALSE;
  10. //EnterCriticalSection(&g_cs);
  11. if (queue1.size() > 0) {
  12. RevData recv = queue1.front();
  13. queue1.pop();
  14. is_get = TRUE;
  15. origin_image = (recv).image;
  16. }
  17. else {
  18. //Sleep(3);
  19. continue;
  20. }

c++ 入队列:


  
  1. start_time = GetTickCount();
  2. sws_scale(img_convert_ctx, pFrameYUV->data, pFrameYUV->linesize, 0, avCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
  3. cv::Mat mat(avCodecCtx->height, avCodecCtx->width, CV_8UC3, pFrameRGB->data[0], pFrameRGB->linesize[0]);
  4. cv::imshow("", mat);//图像显示
  5. cv::waitKey(1);
  6. RevData recvD;
  7. frame_index++;
  8. recvD.cam_id = i;
  9. recvD.image = mat.clone();
  10. //RevData* recvp = (RevData*)malloc(sizeof(RevData));
  11. //memcpy(recvp, &mat, sizeof(RevData));
  12. //EnterCriticalSection(&g_cs);
  13. if (frame_index%2==0) {
  14. queue1.push(recvD);
  15. }

 

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/89893403

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。