繁体   English   中英

线程共享资源C ++

[英]Threads sharing resources 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#,并且只有1个客户端。
  3. 我正在使用image [x] [y]从CVD图像访问图像数据,该图像返回一个表示图像强度的字节值。
  4. CVD图像有一个copyTo()函数。 似乎是对映像进行内存复制,以创建具有相同数据的新对象。 这有用吗?
  5. 我无法在调试模式下运行程序,因为我正在处理没有设置调试模式的现有代码库。

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

有关Windows关键部分的信息,请访问http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682530(v=vs.85).aspx

最后,如果您已有代码,为什么不能打开调试信息并重新构建呢? 否则,您将在黑暗中射击,以查找导致崩溃的原因。

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

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

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

¹我的意思是通话没有重叠

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM