推断c ++中函数的实现

时间:2017-04-10 16:42:38

标签: c++

我正在阅读c ++中rand()函数的文档,它说

  

该函数访问并修改内部状态对象,这可能导致数据争用并发调用rand或srand。一些库提供了一种替代函数,可以明确地避免这种数据竞争:rand_r(非可移植)。 允许C ++库实现保证没有数据争用来调用此函数。

作为一个更一般的问题,我如何确定我正在调用函数的c ++实现(在这种情况下为rand)?

  • rand().cc分机的文件中拨打.cpp
  • 或任何可以确保此
  • 的特定标头

我问这个问题,因为我的理解是当我使用cstdlib标头时,它反过来调用它的{c}实现(stdlib.h)。如果不是这样,那么c ++是否为所有c函数提供了自己的实现?

1 个答案:

答案 0 :(得分:1)

我认为你问的是错误的问题。

您已经了解到允许C ++库实现为您提供没有数据争用的版本。它们是允许的,但它们不是必需这样做。如果你有一些全知的oracle能够告诉你是否正在使用C ++实现,并且如果它告诉你你是,那会解决你的问题吗?不,不是真的,因为您仍然不知道该实现是否会保证数据竞争的缺失。也许会的,但你不确定。

所以你必须提出正确的问题:我怎么知道我正在使用的功能是否保证了这一点?答案是:检查您正在使用的库的特定文档!我想你正在阅读cplusplus.com page on rand。这是一个与特定库无关的通用站点,因此它无法帮助您回答此问题。相反,你使用什么编译器和标准库?检查他们的文档。如果作者声明他们的rand函数保证无竞争,那么继续使用它。否则,保守并假设有一些比赛,不要使用它。

顺便说一下,很多人会告诉你应该避免使用该网站,因为它不是很可靠。通常,cppreference是首选。而且它说

  

rand()是否是线程安全的,是实现定义的。

“实施定义”的含义正是我所说的。如果你继续阅读,它还会列出一些其他问题(它产生的数字毕竟不是随机的),并且

  

建议使用C ++ 11的random number generation工具来替换rand()。