代码中唯一共用的变量g_str已经用临界区进行了同步,似乎没有问题了。但运行的时候却发现有时没有运行到cout时程序便异常退出,或cout并没有输出正确的字符串。
经过调试最后发现问题是出在 string strTmp = GetString();因为VC6自带的STL中的string采用cow方式,这种字符串的浅拷贝带来了多线程时的安全问题。而且这种错误隐藏得比较深,很难调试排错。
结论:
如果要在多线程程序中进行string变量的传递,建议使用深拷贝的string类。
标准库里面的string在多线程下并不保证是都是安全的,只提供两种安全机制:
1.多个线程同时读取数据是安全的。
2.只有一个线程在写数据是安全的。