为什么线程同步会出问题

d277135246 2010-07-07 09:54:16
我在一个线程中不断的从串口中读数据并把它放在一个cstring类中
在另一个线程中我从cstring中取出数据
但是我调试的时候发现串口前几次可以正常读取.. 但在后面却返回了995的错误标号(由于线程退出或应用程序请求,已放弃 I/O 操作。 )
而且在另一个线程中读cstring的时候会出错(提示:user breakpoint called from code at 0x7c92120e)(编译的时候不会出错)
我把代码贴上来请各位帮我看一下
谢谢了

///这是读数据的代码 bh为资源共享区
WaitForSingleObject(Muters,500L );
double dTime = ::timeGetTime()/1000.0;
double dValue[2];
dValue[0] = bh[0];//bh为资源共享区
dValue[1] = 5*sin(4*dTime+5);// 正弦参数的设定

ReleaseMutex(Muters);
///////////////////////////////////////////////////////////////////////////////////////////
//这是向bh写数据的线程
DWORD WINAPI FunProc(LPVOID LpParaneter)
{
DWORD length=12;
char ah[14]={"ppppppppppppp"};


while(1)
{
WaitForSingleObject(Muters,4L);
int da=GetLastError();
ReadFile(hCom,ah,12,&length,NULL);//我在这做了一个断点 发现前几次可以读取串口数据...但是后面就返回995 的错误
int d=GetLastError();
ReleaseMutex(Muters);
int dc=GetLastError();
;
}
return 0;
}

...全文
224 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
d277135246 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 vivvan 的回复:]

同楼上。。。
if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
{
return;
}
……
[/Quote]
你确定要这么改?
我觉得不应该是这么改的..
首先if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
这条语句说的是函数的返回值不等于WAIT_OBJECT_0才会执行下面的语句块
也就是说当函数没有取得信号的时候执行...
额.. 这就和我的目的相反 了..
还有
我要的效果是没有取得信号的时候是延时等候.. 直到取得信号再执行下面的语句
.而兄弟你的建议却是没有取得信号就跳过受保护的语句块

初学C++和MFC.. 说错了请指正..
谢谢
d277135246 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sanguomi 的回复:]

你的同步主要保护哪个?
看你代码, 没看出俩个互斥下有操作相同部分的代码
[/Quote]
额.. 打漏了..
不好意思

DWORD WINAPI FunProc(LPVOID LpParaneter)
{
DWORD length=12;
char ah[14]={"ppppppppppppp"};


while(1)
{
WaitForSingleObject(Muters,4L);
int da=GetLastError();
ReadFile(hCom,ah,12,&length,NULL);//我在这做了一个断点 发现前几次可以读取串口数据...但是后面就返回995 的错误
bh+=ah;// 刚刚打少了不好意思呀
.............
int d=GetLastError();
ReleaseMutex(Muters);
int dc=GetLastError();
;
}
return 0;
}
sanguomi 2010-07-07
  • 打赏
  • 举报
回复
你的同步主要保护哪个?
看你代码, 没看出俩个互斥下有操作相同部分的代码
d277135246 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhou1xp 的回复:]

这个定义一个BUFFER,然后用关键段就可以了
[/Quote]
能说清楚点么..
我刚学mfc
谢谢
zhou1xp 2010-07-07
  • 打赏
  • 举报
回复
这个定义一个BUFFER,然后用关键段就可以了
d277135246 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lazy_2010 的回复:]

WaitForSingleObject 的返回值必须是 WAIT_OBJECT_0 才可以继续操作的,你没有检查返回值啊
[/Quote]
这个没注意到...
谢谢了..
vivvan 2010-07-07
  • 打赏
  • 举报
回复
同楼上。。。
if(WAIT_OBJECT_0!=WaitForSingleObject(Muters,4L))
{
return;
}
……
lazy_2010 2010-07-07
  • 打赏
  • 举报
回复
WaitForSingleObject 的返回值必须是 WAIT_OBJECT_0 才可以继续操作的,你没有检查返回值啊
d277135246 2010-07-07
  • 打赏
  • 举报
回复
大家帮帮我呀..
谢谢了..

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧