初始化错误 - 线程和同步变量
发表于 2007-02-28 08:36 PM 作者: polyrandom
- 初始化顺序仍然是C++里面最普遍的错误之一
- 在多线程情况下,初始化顺序会变得更加难以寻找
- 改变类的继承顺序或是成员变量位置可以简单地改正初始化顺序
在我负责的程序里面,我们有一个用fiber实现的后台处理过程。这部分程序由于使用fiber,所以其实一直占着主线程的时间,通常情况下会把fps降低一半左右。因此这次准备把这段程序放到D3D Present的间歇中去。因为Present不是异步的,我们必须把单线程程序改成多线程的。我的选择是,在另一个线程里面写Present。
这样一个小小的修改,包括设计、编码、测试和改错,花了近一天的时间,最后终于通过检查,commit上去了。下午在调试另一个程序的时候,进入调试模式n次中,突然有一次程序死锁在初始化过程中。于是反复重现,发现一个错误,大致代码如下:
代码:
class MyThread : Thread
{
Semaphore lock_;
uint threadFunc( void* )
{
for(;;)
{
lock_.get();
doSth();
}
}
}; 要修改这个问题很简单,把代码改成:
代码:
class MyThread : Semaphore,Thread
{
uint threadFunc( void* )
{
for(;;)
{
get();
doSth();
}
}
}; 看来,小处还是不能随便呀。
评论总数 0
评论
发表评论 |
作者为 polyrandom 的最新文章
- 调试艺术 (2008-04-19)
- operator==的误用? (2007-04-07)
- 体育彩票的概率 (2007-03-10)
- 初始化错误 - 线程和同步变量 (2007-02-28)
- EPSILON的管理 (2007-02-03)




