我正在阅读此OpenMP tutorial,并遇到以下程序:
i
我有点困惑,循环索引private
是否必须是i
变量。从同一个教程开始:
所有线程都可以修改和访问所有变量(循环索引除外)
所以线程似乎无法控制i
,是不是?顺便说一句,我尝试从private
变量中删除String
,结果似乎没问题。
答案 0 :(得分:1)
不,没有必要指定循环索引变量为#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *p ;
char *q ;
char *l = "aaaaaasdfsfdqwecvxcxfwdsagfd" ;
p = (char*)malloc(sizeof(l)) ;
q = (char*)malloc(strlen(l)) ;
strcpy(p, l) ;
strcpy(q, l) ;
printf("%s\n",p) ;
printf("%s\n",q) ;
printf("%d\n",strlen(l)) ;
return 0 ;
}
。 OpenMP强制执行该操作,并在其许多页面中的某个位置标准状态。
此外,OpenMP标准的要求禁止对循环内的循环索引变量进行任何调整。实际上,OpenMP在C(和C ++)程序上强制执行Fortran内置的约束之一。这使得运行时能够在首次遇到循环时正确地调度跨线程的多次迭代,而不必担心在执行期间分发可能无效。
请记住,在循环初始化时,线程将被分配private
的值集合,这些值根据指定的调度(由程序员或某些实现定义的默认值)分配各个循环迭代。允许线程更新本地&#39; i
的值会导致疯狂的代码