目前我的程序中有两个线程在运行:
主线程 - 从网络摄像头抓取图像,存储在 CVD 中图像。对此图像进行处理。
服务器线程 - 使用命名管道将上述 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
我的问题是,这是一个合适的解决方案吗?我需要什么来实现这个?即,当另一个线程正在执行它自己的代码的一部分时,我如何停止执行我的代码的某些部分。
更多信息:
- 我正在使用 VS2010 C++
- 客户端是C#,只有1个客户端。
- 我正在使用 image[x][y] 访问来自 CVD 图像的图像数据,它返回一个表示图像强度的字节值。
- CVD 图像有一个 copyTo() 函数。它似乎做了图像的内存拷贝以创建具有相同数据的新对象。这会有用吗?
- 我无法在 Debug模式下运行该程序,因为我正在使用未设置 Debug模式的现有代码库。
最佳答案
我会使用循环缓冲区,这样我就可以在读取一个帧的同时向客户端写入一个不同的帧,假设您不想丢帧。
看http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530(v=vs.85).aspx有关 Windows 关键部分的信息。
最后,如果您有现有代码,为什么不能打开调试信息并重新构建?否则,您就是在摸黑寻找这次崩溃的原因。
关于c++ - 线程共享资源C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9751869/