所以我一直在用 C 编写一些应用程序并使用 OpenMP 进行并行化。我实现了一个 Monte-Carlo Pi 估计,发现正常的 rand() 函数不是可重入和线程安全的。建议使用 drand48_r 选项。
现在问题来了,我的应用程序在 Linux 上编译得很好,例如。Ubuntu、Fedora 和 CentOS,但不能在 Mac OS X 上编译。OS X 上的编译错误是。
simple.c:7:错误:“randBuffer”的存储大小未知
用作简单示例的代码是:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
double x;
struct drand48_data randBuffer;
srand48_r(time(NULL), &randBuffer);
drand48_r(&randBuffer, &x);
printf("Random number: %f\n", x);
return EXIT_SUCCESS;
}
我阅读了它,并在手册页中发现了一条注释,
这些函数是 GNU 扩展,不可移植。
这是它的链接:http: //www.kernel.org/doc/man-pages/online/pages/man3/drand48_r.3.html
所以我有很多问题;
- 什么是 GNU 扩展,是什么使它不可移植?
- 在 OS X 上生成随机数时,我有哪些替代方案,它也是线程安全的?
嗯,就是这样。
该示例使用 gcc 编译为,
gcc simple.c -o 简单