- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
嗯,rand_r 函数应该是一个线程安全函数。然而,通过它的实现,我不敢相信它可以使自己不被其他线程改变。假设两个线程将使用相同的变量种子同时调用 rand_r。所以会发生读写竞争。下面列出了 glibc 实现的代码 rand_r。有人知道为什么 rand_r 被称为线程安全的吗?
int
rand_r (unsigned int *seed)
{
unsigned int next = *seed;
int result;
next *= 1103515245;
next += 12345;
result = (unsigned int) (next / 65536) % 2048;
next *= 1103515245;
next += 12345;
result <<= 10;
result ^= (unsigned int) (next / 65536) % 1024;
next *= 1103515245;
next += 12345;
result <<= 10;
result ^= (unsigned int) (next / 65536) % 1024;
*seed = next;
return result;
}
最佳答案
您可以想到线程安全的三个级别,为了便于引用,我将在此处编号。
1) 根本不是线程安全的。从多个线程并发调用该函数是不安全的。例如,strtok
。
2) 相对于系统线程安全。从多个线程并发调用该函数是安全的,前提是不同的调用对不同的数据进行操作。例如,rand_r
、memcpy
。
3) 关于数据的线程安全。从多个线程并发调用该函数是安全的,即使作用于相同的数据也是如此。例如 pthread_mutex_lock
。
rand_r
处于第 2 级,C 上下文中的约定(特别是在 POSIX 规范中)将其称为“线程安全”。
在其他一些语言中,例如 Java,惯例是将级别 3 称为“线程安全”,将其他所有内容称为“非线程安全”。因此,例如 java.util.Vector
是“线程安全的”,而 java.util.ArrayList
是“非线程安全的”。当然 java.util.ArrayList
的所有方法都在第 2 层。所以来自 Java 的程序员可能会自然地调用 rand_r
和 memcpy
”不是线程安全的”。
在 C 语言中,约定是不同的,也许是因为内部同步的数据结构一开始就很少见。在 C 的上下文中,您可能会问“文件句柄是线程安全的吗?”,并且谈论的是级别 3,但是当问“这个函数是线程安全的吗?”时这通常意味着 2 级。
关于c++ - rand_r 是否是真正的线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2772090/
嗯,rand_r 函数应该是一个线程安全函数。然而,通过它的实现,我不敢相信它可以使自己不被其他线程改变。假设两个线程将使用相同的变量种子同时调用 rand_r。所以会发生读写竞争。下面列出了 gli
所以,我很好奇如何有人可以使用 rand_r 命令跨多个线程获取随机值。如果我对种子使用时间(NULL),那么每个人都会得到相同的种子,因为线程创建得非常接近。这些操作都基于该随机种子,因此所有线程对
我在使用 rand_r 时遇到了问题。我有一个生成数百万个随机数的模拟。我注意到,在某个时间点,这些数字不再统一。可能是什么问题? 我做什么:我创建了一个生成器的实例并给它自己的种子。 mainRGe
我正在尝试学习如何使用 rand_r,在阅读了 this question 之后我仍然有点困惑,有人可以看看并指出我错过了什么吗?据我了解, rand_r 需要一个指向某个值(或具有某些初始值的内存)
当我在 vs2008 中使用 rand_r() 时,出现 1 个错误--Identifier is undefined,我可以改用 rand() 吗? (多线程编程工作。)谢谢。 最佳答案 你必须 #
我正在尝试在 C++ 中获取一个随机数,并且我正在使用 rand()。这就是 cpplint说: Consider using rand_r(...) instead of rand(...) for
我被要求不要使用 rand(),因为它们不是“线程安全的”,并且每次也使用不同的种子值。我在 GitHub 上找到了使用如下种子值的示例: unsigned int seed = time(NULL)
我想改变 rand_r 方法对 srand/rand 的使用或与其他带种子的随机生成器一起使用。 在代码中有一个循环调用带有种子的train方法。 int nseeds = 5; for (int s
我想知道为什么在包含 cstdlib 时我不能使用 std::rand_r?或者,更一般地说,为什么 cstdlib 中的某些函数在全局命名空间中,但不在 std 命名空间中? 最佳答案 rand_r
所以我有多个线程将使用 rand_r 函数。这个函数的签名是: int rand_r(int *val); 我试图利用这段时间为这个函数做种子,但我遇到了各种各样的麻烦。任何人都可以向我解释我将如何使
std::random_shuffle 线程安全吗?我认为不是,因为常规的 rand() 不是线程安全的。如果是这种情况,我将如何将 rand_r 与 random_shuffle 一起使用,以便我可
我需要有关如何使用 rand_r() 生成 -1 到 1 之间的随机数的帮助。我在网上寻找如何做到这一点的示例并没有太多运气。任何帮助将不胜感激。 最佳答案 每次调用rand_r时,都会将状态变量的地
我想了解并行随机数生成的正确用法。在查阅了不同的资源后,我写了一个看起来可以工作的简单代码,但如果有人能证实我的理解,那就太好了。 为了指出rand()和rand_r()的区别和关系,我们来求解: P
以下代码使用 1 个线程比使用 2 个线程执行得更好(不过,使用 4 个线程可以提高速度): #include #include #include int main(int argc, char
我正在尝试将一些代码从 linux 移植到 cygwin 下的 windows。我发现这个奇怪的错误,其中“rand_r 未在此范围内声明”。我将 gcc 4.8.1 用作 x86_64-w64-mi
我正在创建许多线程,每个线程都应该输出一个随机数。 我知道 srand() 和 rand 不是线程安全的,事实上所有的输出数字都是相同的。 所以我尝试使用 rand_r 但我在 Windows 终端上
我是一名优秀的程序员,十分优秀!