do { evt = &newevts[ evt_head++ ]; evt_head &= MAX_EVENTS; if (evt->index <= 0 || evt->index > MAX_INDEX) { printf("RX EVENT BAD NDX: ndx=%dh=%dn",evt->index,evt_head); continue; } //... etc ... } while(evt_head != evt_tail) ;
奇怪的问题是if语句可以评估evt->索引是一个不好的值,但是当printf显示它时显示一个完全有效的值! 例:
RX EVENT BAD NDX: ndx=1 h=64
if语句清楚地显示条件必须是<= 0 OR> 1024(最大索引)。 更糟糕的是,这只会偶尔发生一次。 我正在使用GCC,Centos 6.3。 没有线程触摸evt_head,除了这个线程。 (我已经重新命名了几次,然后重新编译,以确保它。)
当物理内存中的可用空间非常低时,Windows仍然能够分配内存吗?
在多台计算机上共享内存?
可以禁用“应用程序错误”对话框吗?
如果在特定地址写入,则挂起进程
在32位操作系统上存储超过3GB的video帧
尾部由一个函数处理,该函数以与头部删除它们相同的方式将项目添加到队列中(然后增加AND)。 我还在事件结构本身中添加了一个计数器,以便在事件放入队列中时logging头部/尾部值,并find没有丢失或跳过的值。 它从字面上看起来好像我得到了一些不好的内存读取。 但是这太可笑了 – 如果真是这样的话,我希望系统崩溃或至less程序崩溃。
任何关于如何在世界上可能偶尔发生的想法? (频率大约是100次读取中的1次)我很欣赏任何input!
typedef struct { int index; int event; } EVENT; #define MAX_EVENTS 0x01ff #define MAX_INDEX 1024
没有线程或其他代码触及evt_head。 只有这个循环。 队列永远不会靠近。 我也碰巧有一个“SPIN LOCK”入口,join队列(准备稍后被其他线程访问),并在退出时解锁。
函数如何存储在内存中?
STL容器内存问题
pipe理私人堆
“最大的自由区域”性能计数器?
我的猜测是,添加事件到你的尾巴的函数将改变evt_tail写入index字段之前。 这使您的读者可以访问正在写入的事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。