如果不考虑把代码封装到一起,可以在每一个线程中调用srand ,这种做法其实也是最标准的,如果代码中要用到随机数的地方比较多,还是不要把srand与rand封装到一起。
如果每个线程会用到的比较少的次数,想把代码封装到一起的前提下,在VC++中可以简单的使用TLS(线程本地储存)来作用一个用于标志的变量来使srand在每个线程中只会被执行一次,由于使用到TLS,在效率上首先就要低得多,因为内部要进行线程互斥,所以我个人还是推荐标准的做法。
具体代码很简单
unsigned int __rand_count = 0;//这个计数保证每个线程的time(NULL)不相同
__declspec(thread) bool __srand_tls = false;
int _rand()
{
if(!__srand_tls)
{
srand((unsigned int)time(NULL) + count);
++count;
__srand_tls ^= 1;
}
return rand();
}
根据上面的代码,标准的做法就很好理解了
只要在线程开始时使用一次srand配合保证时间种子的随机性的全局变量计数,就可以了。
但是这种东西,明显就不是很重要的东西,往往会被大家在不知不觉中就遗忘掉了,所以我现在的做法是,封装自己的工作者线程类时直接把srand给写进去,就一劳永逸了,因为这种东西大多数情况下还是在工作者线程中使用,至于UI线程,没考虑到要用在哪方面,而我也没本事封装一个完善的UI线程类。所以,就不考虑了。