多线程静态方法重入错误
2006年4月6日
Static function variable in multithread
今天花了4个小时来折腾这个.在写一个多线程下载程序,突然发现下载下来的数据包不对,先是怀疑数据拼接有问题,然后是怀疑网络传送端有问题,一个一个的dump出来看.然后用脚本一个一个字节的比对.最后,才知道原来是这个.
void CSimpleSocket::Read(string &buf) { static char buf[BUF_SIZE]; //... }
这种function scope 的static 变量,多线程使用会被反复的修改.
libc time.h里面几个函数不是线程安全,就是这个原因.这样做,其实也省不了多少资源,去掉static不过多了两条push stack的指令.这种优化强迫症,自从学了汇编以来一直这样.有个重要原则是
先把事情做正确