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

Posted

技术标签:

【中文标题】从主循环访问线程变量 - c++ - windows【英文标题】:access to a thread variable from main loop - 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 。我该怎么做?

【问题讨论】:

【参考方案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 个内核)并且没有其他可以运行的应用程序你的系统,我认为这个线程不会在同一个硬件单元上;)

以上是关于从主循环访问线程变量 - c++ - windows的主要内容,如果未能解决你的问题,请参考以下文章

从主线程触发一个线程中的动作的防弹方法?

多线程设计,保护C++中的全局成员

Java并发编程

在从主线程访问后,不得从后台线程对 > 布局引擎进行修改

在 C++ 中的线程内启动和停止循环

无法从主项目访问变量?