以下为《操作系统课程设计代码中的常见错误总结》的无排版文字预览,完整内容请下载
代码中的常见错误
程序正确性测试方法:
(1)先去除程序中的多线程,使其变成一个普通的C++程序。
(2)然后将该程序中的各个函数反复调用多次,模拟多次添加、删除、查询等数据操作。
(3)每次操作后,输出结果查看一下。如果发现结果错误,或者出现程序非法结束的情况,说明你的代码内部有问题。这时,你的问题比较难以发现,你需要仔细分析可能出现 错误的函数,最有可能出现错误的函数是删除函数和clear函数。用VC++的单步调试方法调试你的程序
(4)直到程序运行结果正确。再加入多线程机制,看在多线程下运行是否也能正确。
错误代码举例 【请大家仔细阅读,看自己是否也犯有这些错误】:
(1)代码缺乏全面测试。发给我的代码和最终提交代码后面,必须给出输入数据和测试结果。
int QueueEmpty()
{
if(this->m_Q.front==this->m_Q.rear)
return 1;
else 啥也不做,不能实现清空队列的操作
return 0;
}
(2)return 1; 后面的语句永远无法执行
int InitQueue()
{
WaitForSingleObject(mutex,INFINITE);
。。。。。此处省略具体代码
return 1; 运行至此,函数返回,后面的语句无法执行
ReleaseMutex(mutex);
}
(3)mutex使用前没有先调用CreateMutex()创建互斥量mutex,就直接使用。
HANDLE mutex;
WaitForSingleObject(mutex,INFINITE);
(4)代码缺少注释。 没有详细注释的代码,最终成绩最高为“中”。
写代码注释的另一个好处是,能够帮你理顺思路,帮你发现程序上的逻辑错误。前面举的错误例子,如果你有代码注释,就一定能够发现。
代码注释就是你用简洁的文字把你的“代码逻辑、变量的作用、函数的作用、语句的作用”等内容解释给其他人听,要求是别人看了你的代码注释,就能够领会你的代码意图。
(5)如果你写的是多线程安全的数据结构(栈、队列、链表等),要参考课本上的读者-写者问题的解决方法,查询是读者,插入、删除或修改是写者,要实现读写互斥和写写互斥。
这一点非常重要,很多同学的代码中使用一个mutex互斥量,实现所有操作的保护,这些代码都是不合格的。要求多个线程可以同时执行查询函数,但每次只允许一个线程修改数据。
int EnQueue(QElemType e)
{
WaitForSingleObject(mutex,INFINITE);
。。。。。。具体代码省略
ReleaseMutex(mutex);
}
int DeQueue()
{
WaitForSingleObject(mutex,INFINITE);
。。。。。。具体代码省略
ReleaseMutex(mutex);
}
int PrintQueue()
{
WaitForSingleObject(mutex,INFINITE);
。。。。。。具体代码省略
ReleaseMutex(mutex);
}
(6)这是一个非常普遍存在的问题:向文件中写入数据之前,没有用互斥量进行写文件的保护。试想:如果恰好有两个线程同时向文件的同一地方写入数据,会发生什么后果?
//生产者线程
unsigned __stdcall Producer (void* para)
内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 的问题。
Push(S,b);
Sleep(1000);
Push(S,c);
Sleep(1000);
加入Sleep()后,会使当前线程挂起,产生线程切换,你调用Sleep(1000),在这一秒内,其他线程可能已经运行完毕,也就是说,你的代码变成了“你干活,我睡觉”、“我干活,你睡觉”的多线程“串行”执行的程序,很难检查出你的代码问题。
其它小问题:
(1)全局变量的名字要有意义,不要用i,j,k,t作为全局变量,要用gThreadCount、gMatrix这种有意义的全局变量名字。
(2)程序结束前,没有调用CloseHandle()关闭线程、信号量等资源的句柄。
[文章尾部最后300字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。
以上为《操作系统课程设计代码中的常见错误总结》的无排版文字预览,完整内容请下载
操作系统课程设计代码中的常见错误总结由用户“xinghen86”分享发布,转载请注明出处