线程共享资源C++



我的程序中目前有两个线程在运行:

  1. 主线-从网络摄像头抓取图像,存储在CVD图像中。对此图像进行处理。

  2. 服务器线程-使用命名管道将存储在上述CVD映像中的完整映像数据发送到其客户端。

当我运行我的程序时,它会在崩溃前工作很短一段时间,出现以下异常:

0xC000005: Access violation reading location 0x0000000

我认为这是因为我的服务器线程正试图与主线程同时访问映像。

我以前没有做过任何并发编程(这是我第一次),但目前我对如何解决它有一个模糊的想法。

我的计划是在服务器准备将图像发送到客户端时,使用某种锁来阻止从主线程访问图像。然而,我意识到可能存在一个问题,即当客户端不断请求新帧时,服务器线程不断保留资源。因此,我想只在从网络摄像头获取新帧时才对客户端做出响应,以避免上述阻塞问题。

综上所述:

主线程:

1. If Image is available
   then - Lock image, copy over new data from webcam, release image
   else - goto 1
2. Do processing

服务器:

1. Receive request for new frame from client
2. If (haven't sent the current frame yet)
   then - Lock CVD image access, send over frame, release image.
   else - wait until new image available.
3. goto 1

我的问题是,这会是一个合适的解决方案吗?为了实现这一点,我需要什么?即,当另一个线程正在执行其自身代码的一部分时,我如何停止执行代码的某些部分。

更多信息:

  1. 我正在使用VS2010 C++
  2. 客户端在C#中,并且只有一个客户端
  3. 我使用返回表示图像强度的字节值的图像[x][y]来访问来自CVD图像的图像数据
  4. CVD图像中有一个copyTo()函数。它似乎是对图像进行内存复制,以创建具有相同数据的新对象。这有用吗
  5. 我无法在调试模式下运行程序,因为我正在处理没有设置调试模式的现有代码库

我会使用一个循环缓冲区,这样我就可以在读取一个帧的同时向客户端写入另一个帧,假设你不想丢弃帧。

看看http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530(v=vs.85).aspx获取有关Windows关键部分的信息。

最后,如果您有现有的代码,为什么不能打开调试信息并重新生成?否则,你就是在黑暗中开枪,试图找出这次车祸的原因。

当另一个线程正在执行自己的代码的一部分时,我如何停止执行代码的某些部分

同步将由管道本身完成——如果您在客户端中调用ReadFile(),它将暂停执行,直到一些数据通过它。

MSDN上有管道服务器和客户端的示例实现。这可能会有所帮助。

我的意思是不重叠呼叫

最新更新