我正在阅读c ++中rand()
函数的文档,它说
该函数访问并修改内部状态对象,这可能导致数据争用并发调用rand或srand。一些库提供了一种替代函数,可以明确地避免这种数据竞争:rand_r(非可移植)。 允许C ++库实现保证没有数据争用来调用此函数。
作为一个更一般的问题,我如何确定我正在调用函数的c ++实现(在这种情况下为rand
)?
rand()
或.cc
分机的文件中拨打.cpp
。我问这个问题,因为我的理解是当我使用cstdlib
标头时,它反过来调用它的{c}实现(stdlib.h
)。如果不是这样,那么c ++是否为所有c函数提供了自己的实现?
答案 0 :(得分:1)
我认为你问的是错误的问题。
您已经了解到允许C ++库实现为您提供没有数据争用的版本。它们是允许的,但它们不是必需这样做。如果你有一些全知的oracle能够告诉你是否正在使用C ++实现,并且如果它告诉你你是,那会解决你的问题吗?不,不是真的,因为您仍然不知道该实现是否会保证数据竞争的缺失。也许会的,但你不确定。
所以你必须提出正确的问题:我怎么知道我正在使用的功能是否保证了这一点?答案是:检查您正在使用的库的特定文档!我想你正在阅读cplusplus.com page on rand。这是一个与特定库无关的通用站点,因此它无法帮助您回答此问题。相反,你使用什么编译器和标准库?检查他们的文档。如果作者声明他们的rand
函数保证无竞争,那么继续使用它。否则,保守并假设有一些比赛,不要使用它。
顺便说一下,很多人会告诉你应该避免使用该网站,因为它不是很可靠。通常,cppreference是首选。而且它说
rand()是否是线程安全的,是实现定义的。
“实施定义”的含义正是我所说的。如果你继续阅读,它还会列出一些其他问题(它产生的数字毕竟不是随机的),并且
建议使用C ++ 11的random number generation工具来替换rand()。