【问题标题】:access to a thread variable from main loop - c++ - windows从主循环访问线程变量 - c++ - windows
【发布时间】:2014-04-21 11:26:51
【问题描述】:

我对线程的概念完全陌生。

我必须使用线程从我的主程序中更新相机中的一些 cv::mat 变量。

我只知道线程意味着共享变量的问题:/

所以我认为我不能在主线程和线程中都使用通用变量

我正在使用

    #include <thread> 

这是我的线程 fct:

    void MyThreadFunction()
    {
        cv::Mat a;
        cv::Mat b;

        while (1)
        {
            capture_L.read(a);
            capture_R.read(b);
        }

    }

我在进入我的主循环(用于渲染)之前调用它。所以我的目标是在我的主要功能中访问 a 和 b 。我该怎么做?

【问题讨论】:

    标签: c++ multithreading opencv camera


    【解决方案1】:

    确实,如果你从多个线程访问你的ab 变量,就会出现互斥问题。这可以通过使用mutex 来解决。在读取和/或写入变量之前,您需要 lock 互斥锁,之后需要 unlock 它。这可以通过lock_guard 完成。

    你可以这样做:

    #include <mutex>
    #include <thread>
    
    void MyThreadFunction(mutex& m, cv::Mat& a, cv::Mat& b)
    {
        while (1)
        {
            [ ... ]
    
            {
              lock_gard<mutex> l(m);
              capture_L.read(a);
              capture_R.read(b);
            }
        }
    
    }
    
    int main()
    {
      mutex m;
      cv::Mat a, b;
    
      thread t(MyTjreadFunction, ref(m), ref(a), ref(b));
    
      {
         lock_gard<mutex> l(m);
         [ ... access a & b ... ]
      }
    
      t.join();
    
      return 0;
    }
    

    【讨论】:

    • 顺便问一下。该线程是否会通过与主应用程序相同的处理器进行处理?因为那些该死的 cv 读取方法似乎在等待新图像时将处理器置于睡眠模式,即使在线程中它仍然会减慢我的所有程序。
    • 这个线程可以安排在同一个硬件处理器上。这取决于很多参数,例如您拥有的物理内核数量、您的操作系统、您的应用程序的环境......但是如果您有,例如,一个 i7(= 8 个内核)并且没有其他可以运行的应用程序你的系统,我认为这个线程不会在同一个硬件单元上;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多