科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件技巧 - 多线程下的随机数初始化 srand()

技巧 - 多线程下的随机数初始化 srand()

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

今天在调试程序时候发现某个线程中的 rand() 随机函数每次运行都返回同一个数据,检查了程序,在程序中也调用了 srand(GetTicketCount()) 来初始化随机数生成器,那为什么每次运行结果还一样呢???

作者:一无所知 来源:CSDN 2008年3月19日

关键字: 随机数 多线程 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

今天在调试程序时候发现某个线程中的 rand() 随机函数每次运行都返回同一个数据,检查了程序,在程序中也调用了 srand(GetTicketCount()) 来初始化随机数生成器,那为什么每次运行结果还一样呢???

后来发现,这个问题和多线程有关,跟踪 srand 和 rand 的函数内部后发现,其实 srand 和 rand 内部是使用了TlsGetValue等函数来存储随机数种子了,也就是说,这个随机数种子对每个线程都需要初始化一次 srand,而以前的代码是在主线程中初始化了一次,当然每次的结果都一样了。

 

void __cdecl srand (
        unsigned int seed
        )
{
#ifdef _MT

        _getptd()->_holdrand = (unsigned long)seed;

#else  /* _MT */
        holdrand = (long)seed;
#endif  /* _MT */
}

_ptiddata __cdecl _getptd (
        void
        )
{
        _ptiddata ptd;
        DWORD   TL_LastError;


        TL_LastError = GetLastError();
        if ( (ptd = TlsGetValue(__tlsindex)) == NULL ) {
            /*
             * no per-thread data structure for this thread. try to create
             * one.
             */
            if ( ((ptd = _calloc_crt(1, sizeof(struct _tiddata))) != NULL) &&
                TlsSetValue(__tlsindex, (LPVOID)ptd) ) {

                /*
                 * Initialize of per-thread data
                 */

                _initptd(ptd);

                ptd->_tid = GetCurrentThreadId();
                ptd->_thandle = (unsigned long)(-1L);
            }
            else
                _amsg_exit(_RT_THREAD); /* write message and die */
            }

        SetLastError(TL_LastError);


        return(ptd);
}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章