Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
推断c+中函数的实现+; 我正在浏览C++中的代码>代码>(代码)> /COD>函数,它表示_C++ - Fatal编程技术网

推断c+中函数的实现+; 我正在浏览C++中的代码>代码>(代码)> /COD>函数,它表示

推断c+中函数的实现+; 我正在浏览C++中的代码>代码>(代码)> /COD>函数,它表示,c++,C++,该函数访问和修改内部状态对象,这可能会导致数据争用,同时调用rand或srand。有些库提供了另一个明确避免这种数据竞争的函数:rand_r(不可移植)C++库实现允许保证调用此函数时不存在数据竞争。 作为一个更一般的问题,我如何确定我调用的是函数的C++实现(在这个例子中 RAND )? 在扩展名为.cc或.cpp的文件中调用rand() 或者,可以确保这一点的任何特定标头 我问这个问题是因为我的理解是,当我使用cstdlib头时,它反过来调用该头的c实现(stdlib.h)。如果不是这样

该函数访问和修改内部状态对象,这可能会导致数据争用,同时调用rand或srand。有些库提供了另一个明确避免这种数据竞争的函数:rand_r(不可移植)C++库实现允许保证调用此函数时不存在数据竞争。

作为一个更一般的问题,我如何确定我调用的是函数的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。