线程共享资源C ++

时间:2012-03-17 16:57:27

标签: c++ image concurrency locking ipc

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

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

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

  3. 当我运行我的程序时,它会在崩溃之前运行很短的时间,并出现以下异常:

    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. 我使用image [x] [y]从CVD图像访问图像数据,返回表示图像强度的字节值。
    4. CVD图像有一个copyTo()函数。它似乎做了一个图像的内存副本来创建一个具有相同数据的新对象。这会有用吗?
    5. 我无法在调试模式下运行程序,因为我正在处理没有设置调试模式的现有代码库。

2 个答案:

答案 0 :(得分:1)

我会使用循环缓冲区,因此我可以在向客户端写入不同的帧时读取一帧,假设您不想丢帧。

请查看http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530(v=vs.85).aspx以获取有关Windows Critical Sections的信息。

最后,如果您有现有代码,为什么不能打开调试信息并重建?否则你会在黑暗中拍摄,试图找到造成这次事故的原因。

答案 1 :(得分:0)

  

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

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

MSDN上有管道serverclient的示例实现。这可能有所帮助。

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