推断c+中函数的实现+; 我正在浏览C++中的代码>代码>(代码)> /COD>函数,它表示
该函数访问和修改内部状态对象,这可能会导致数据争用,同时调用rand或srand。有些库提供了另一个明确避免这种数据竞争的函数:rand_r(不可移植)C++库实现允许保证调用此函数时不存在数据竞争。推断c+中函数的实现+; 我正在浏览C++中的代码>代码>(代码)> /COD>函数,它表示,c++,C++,该函数访问和修改内部状态对象,这可能会导致数据争用,同时调用rand或srand。有些库提供了另一个明确避免这种数据竞争的函数:rand_r(不可移植)C++库实现允许保证调用此函数时不存在数据竞争。 作为一个更一般的问题,我如何确定我调用的是函数的C++实现(在这个例子中 RAND )? 在扩展名为.cc或.cpp的文件中调用rand() 或者,可以确保这一点的任何特定标头 我问这个问题是因为我的理解是,当我使用cstdlib头时,它反过来调用该头的c实现(stdlib.h)。如果不是这样
作为一个更一般的问题,我如何确定我调用的是函数的C++实现(在这个例子中<代码> RAND )?
- 在扩展名为
或.cc
的文件中调用.cpp
rand()
- 或者,可以确保这一点的任何特定标头
我问这个问题是因为我的理解是,当我使用
cstdlib
头时,它反过来调用该头的c实现(stdlib.h
)。如果不是这样的话,C++是否为所有的C函数提供了自己的实现? < P>我想你问的问题是错的。
您已经了解到C++库实现允许给您一个没有数据竞争的版本。他们是被允许的,但不需要这样做。如果你有一些无所不知的Oracle能够告诉你你是否使用C++实现,如果它告诉你你是谁,那么你的问题会解决吗?不,不是真的,因为您仍然不知道该实现是否能保证不存在数据竞争。也许会,但你没有把握
所以你必须问一个正确的问题:我如何知道我使用的函数是否保证了这一点?答案是:检查您正在使用的库的特定文档!我想你正在看报纸。这是一个通用的站点,与特定的库无关,所以它不会帮助您回答这个问题。相反,您使用的是什么编译器和标准库?检查他们的文件。如果作者声明他们的rand
函数保证是无种族的,那么继续使用它。否则,要保守,并假设有一些种族,不要使用它
顺便说一句,很多人会告诉你应该避免使用那个网站,因为它不太可靠。一般情况下,最好使用。上面说
rand()是否为线程安全由实现定义
其中“实现定义”的意思正是我所说的。如果你继续阅读,它还会列出一些其他问题(它生成的数字毕竟不是随机的),并且
建议使用C++11的工具替换rand()
解决方法:不要使用
rand
,而是使用工具。正确的解决方案是不要使用rand
。根据rand
的手册页,如果您想要更线程安全的版本,它说要使用rand\r
。C库也可以保证没有数据争用。要确定您使用的实现是否是线程安全的,请使用RTFM。