从主循环访问线程变量 - 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】:确实,如果你从多个线程访问你的a
和b
变量,就会出现互斥问题。这可以通过使用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的主要内容,如果未能解决你的问题,请参考以下文章