首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程共享资源C++

线程共享资源C++
EN

Stack Overflow用户
提问于 2012-03-17 16:57:26
回答 2查看 438关注 0票数 2

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

  1. 主线程从摄像头抓取图像,存储在化学气相沉积图像中.对这个图像进行处理。
  2. 服务器线程-使用命名管道将存储在上述CVD映像中的完整图像数据发送给其客户端。

当我运行我的程序时,它在崩溃之前工作了很短时间,只有以下例外:

代码语言:javascript
复制
0xC000005: Access violation reading location 0x0000000

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

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

我的计划是设置某种锁,以防止服务器准备将映像发送到客户端时从主线程访问映像。然而,我意识到,在客户端不断请求新框架时,服务器线程不断地保存资源可能会出现问题。因此,我想,只有当一个新的框架从网络摄像头抓取时,才能响应客户端,以避免上述阻塞问题。

总括而言:

主螺纹:

代码语言:javascript
复制
1. If Image is available
   then - Lock image, copy over new data from webcam, release image
   else - goto 1
2. Do processing

服务器:

代码语言:javascript
复制
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. 我使用imagex访问CVD图像中的图像数据,它返回一个字节值,表示图像的强度。
  4. CVD映像中有一个copyTo()函数可用。它似乎做了图像的内存副本,以创建一个具有相同数据的新对象。这有用吗?
  5. 我无法在调试模式下运行该程序,因为我正在处理一个没有调试模式集的现有代码基。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-17 17:13:30

我会使用一个循环缓冲区,这样我就可以在向客户端写入另一个框架时读取一个框架,前提是您不想删除框架。

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

最后,如果您有现有的代码,为什么不能打开调试信息并重新构建呢?否则你就会在黑暗中开枪,试图找出这次坠机的原因。

票数 1
EN

Stack Overflow用户

发布于 2012-03-17 17:33:20

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

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

在MSDN上有管道服务器客户端的示例实现。也许能帮上忙。

我指的是不重叠的电话

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9751869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档