c - C 中的系统命令强制在 OSX 上串行运行?

标签 c macos openmp

我正在使用 Mac OSX 10.8.4 并使用 C 进行编程。我尝试使用 openmp 并使用 gcc-mp-4.7 进行编译。我在 bash 工作。目前我有一个可执行文件(我将在程序中调用executable1),我试图通过在 openmp 并行 for 循环内部使用系统调用来并行运行它。示例代码如下:

my_omp.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>

void main() {
    int n = 100;

    double var1         = 65.4;
    char place[100]     = "/under/a/rock";
    double var2         = 4.5e4;
    double var3;

    char program[200];

    int i;
#pragma omp parallel for private(program,var3)
    for (i=0; i<=n; i++) {
        var3 = var1*pow(var2,i);
        sprintf(program,"./executable1 %.15e %s %.15e %d", var1, place, var2, var3, i);
        printf("%s \n", program);
        system(program);
    }

}

我使用 gcc-mp-4.7 -fopenmp my_omp.c 编译程序,然后运行新编译的可执行文件(名称与 exectuable1 不同)。

似乎发生的情况是,8 个打印语句(我相信是 openmp 认为我拥有的“cpu”数量)将出现在 stdout(终端)中,然后它将仅运行可执行文件的单个调用1 ,然后当它完成时,它会打印出另一个 printf 程序行,然后运行另一个可执行文件 1 直到完成 for 循环(我知道这一点,因为可执行文件 1 非常冗长,而且很明显,其中两个以打印到标准输出的数字运行不同步并多次出现)。

所以看来 printf 可能是并行运行的,但由于某种原因 system() 命令不是并行运行?有人有什么想法吗?

感谢您提供的任何帮助。

更新:

我已经得到了这个确切的代码,可以使用不同的编译器在 lunix 发行版上正确运行,我将寻找一个更好的编译器在 Mac OSX 中使用,看看是否有效。

最佳答案

OS X 中的 system(3) 库调用是使用全局互斥锁实现的 - 请参阅 system.c OS X 的 C 库源代码中的文件:

#if __DARWIN_UNIX03
    pthread_mutex_lock(&__systemfn_mutex);
#endif /* __DARWIN_UNIX03 */
...
#if __DARWIN_UNIX03
    pthread_mutex_unlock(&__systemfn_mutex);
#endif /* __DARWIN_UNIX03 */

因此,当一个线程调用 system(3) 时,所有其他线程都必须等待第一个调用完成,从而导致序列化执行。

关于c - C 中的系统命令强制在 OSX 上串行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17456487/

相关文章:

c - C字符串存放在哪个数据段?

mysql - 是什么迫使我的系统在 "/opt/local/var/run/mysqld/mysqld.sock"中查找 MySQL

macos - 尝试在 Mac 上安装 openMP/Clang

c - 为什么在 Linux 中没有库说明符就不会出错?

c - 搜索和替换文本

c - C 中带 0 的位掩码

java - 您将全局应用程序数据放在 Linux 上的什么位置(特别是 Mint 13)?

macos - 快速工具栏中的 TabView

C++ vector 下标超出范围omp锁

c++ - 为什么具有随机数生成功能的 OpenMP 比串行代码慢