从主循环访问一个线程变量 - c ++ - windows

时间:2014-04-21 11:26:52

标签: c++ multithreading opencv camera

我对线程的概念完全不熟悉。

我必须使用一个线程从我的主程序中更新一些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。我怎么能这样做?

1 个答案:

答案 0 :(得分: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;
}