社区
进程/线程/DLL
帖子详情
EnterCriticalSection时候异常,请教大侠
Leo_red
2008-08-29 11:00:00
我多线程发起6个线程乱跑时,除抛出异常0xc00000005,居然是在
EnterCriticalSection的时候,很奇怪,请教各位这是什么原因阿?
我是正常的初始化了临界区的,调用的InitializeCriticalSection。就是几个线程乱跑时会随机出现这个问题。
我的操作系统是XPSP3
...全文
1384
15
打赏
收藏
EnterCriticalSection时候异常,请教大侠
我多线程发起6个线程乱跑时,除抛出异常0xc00000005,居然是在 EnterCriticalSection的时候,很奇怪,请教各位这是什么原因阿? 我是正常的初始化了临界区的,调用的InitializeCriticalSection。就是几个线程乱跑时会随机出现这个问题。 我的操作系统是XPSP3
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xue23
2011-11-21
打赏
举报
回复
sofa
vigorousfish
2010-10-12
打赏
举报
回复
KANKAN
vonfrostburn
2009-11-26
打赏
举报
回复
需要回复才能阅读,太损了
Leo_red
2008-09-03
打赏
举报
回复
555.只能加100分,我就血本交大家朋友把...
Leo_red
2008-09-03
打赏
举报
回复
嗯,确实还是因为有越界造成了异常.越界是梦魇阿,总是冤枉别的好人.
感谢各位鼎力相助,帖子补到50分,希望各位满意.
licry01
2008-09-02
打赏
举报
回复
1
支持4楼的,请检查其他地方的代码是否有内存误操作之类的东东.
比如,内存操作越界什么的.
我有一次也碰上这个问题,也是在EnterCriticalSection出现异常0xc00000005,而问题不在这上面,是我的内存操作越界,我的一个长度为50的数组,我执行了下面的操作:
TCHAR buff[50];
memset(buff,100,0);
Leo_red
2008-09-02
打赏
举报
回复
[Quote=引用 7 楼 gaoteng1984 的回复:]
引用楼主 Leo_red 的帖子:
我是正常的初始化了临界区的,调用的InitializeCriticalSection。就是几个线程乱跑时会随机出现这个问题。
在主线程里先调了InitializeCriticalSection,然后再创建的6个子线程吗?
[/Quote]
这到不是,这个临界区是被对象持有的,对象可以有很多个,6个线程根据业务随时处理不同的对象。
为了防止两个以上线程同时操作这个对象时,一些敏感的数据引起问题,就用临界区保护这个数据,要操作该对象的特定数据时候需要先Enter一下。
所以Initialize是在对象创建出来初始化时候做的。
zhkza99c
2008-09-02
打赏
举报
回复
[Quote=引用 5 楼 superlym2005 的回复:]
是否有嵌套
[/Quote]
我也觉得可能有嵌套
gaoteng1984
2008-09-02
打赏
举报
回复
[Quote=引用楼主 Leo_red 的帖子:]
我是正常的初始化了临界区的,调用的InitializeCriticalSection。就是几个线程乱跑时会随机出现这个问题。
[/Quote]
在主线程里先调了InitializeCriticalSection,然后再创建的6个子线程吗?
Leo_red
2008-09-01
打赏
举报
回复
哦,四楼说的有道理。我调试时候确实是早就知道 VC在多线程情况下它显示出问题的地方那个经常是在真正出问题的地方之后。
但是因为临界区本身涉及内核对象,感觉很不确定。
回5楼:逻辑检查拉一下,没有嵌套的加锁,但是似乎嵌套的加并递归解锁出来不会有问题的吧?
顺便再问,在网上看到一个帖子,没有加锁的情况下解锁会出现异常,我写代码试了一下,并没有异常出现。
各位大侠说说会有异常抛出吗?
JonathanS666
2008-09-01
打赏
举报
回复
是否有嵌套
danscort2000
2008-08-31
打赏
举报
回复
你应该注意代码其他地方
VC多线程调试有个问题,那就是常常出现异常已经发生,但是代码依然在继续运行
你应该检查之前的代码
Leo_red
2008-08-31
打赏
举报
回复
对了,那就顺便问问InitializeCriticalSectionAndSpinCount这个函数的问题。
我的是XP系统,怎么便以时候好像不能使用这个函数阿。
网上查一查好像说是这个只能在2000和之前的操作系统上使用。
c38041125
2008-08-29
打赏
举报
回复
InitializeCriticalSectionAndSpinCount()
c38041125
2008-08-29
打赏
举报
回复
InitialazeCriticalSectionAndSpinCount()代替InitializeCriticalSection()试试.
Enter
Criti
ca
lS
ect
ion
讲解
Enter
Criti
ca
lS
ect
ion
问题解决——使用
Criti
ca
lS
ect
ion
后 0xXXXXXXXX处最可能的
异常
: 0xC0000005: 写入位置 0x00000014 时发生访问冲突
想了半天,觉得还得从提示入手:最可能的
异常
: 0xC0000005: 写入位置 0x00000014 时发生访问冲突。 这位置?这个位置就是……
Enter
Criti
ca
lS
ect
ion
用法
Enter
Criti
ca
lS
ect
ion
在使用Poco库调试时出现
异常
,
异常
位置:
Enter
Criti
ca
lS
ect
ion
(&_cs);
1、在使用Poco库调试时会出现
异常
,
异常
所在文件是Poco\Mutex_WIN32.h,如下图所示: 2、出现以上
异常
在
Enter
Criti
ca
lS
ect
ion
(&_cs);前加入Initialize
Criti
ca
lS
ect
ion
(&_cs);即可正常运行,如下图所示:
Enter
Criti
ca
lS
ect
ion
多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用
Enter
Criti
ca
lS
ect
ion
和Leave
Criti
ca
lS
ect
ion
函数。 目录 1函数原型 2访问机制 1函数原型编辑 函数
Enter
Criti
c
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章