关于 Unified Parallel C 中的指针6
 
- UID
- 1066743
|

关于 Unified Parallel C 中的指针6
指向共享数据指针转换为指向私有数据指针指向共享数据指针转换为指向私有数据指针存在下面几种情况:
- 如果将一个指向共享数据指针转换为一个普通 C 语言中的指针,而该指向共享数据指针与当前执行线程没有亲缘关系,结果无意义。
- 如果将一个指向共享数据类型的空指针转换为一个指向私有数据指针,结果是一个空指针。例如:
1
2
3
| shared int *p1=NULL;
int *p2;
p2=(int *)p1; // p2 是一个空指针
|
- 如果将一个指向共享数据指针转换为一个普通 C 语言中的指针,而该指向共享数据指针与当前执行线程有亲缘关系,结果有意义,如清单 15 中的程序所示。
清单 15. 结果有意义1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # include <upc.h> // 假定程序由 2 个线程运行
# include <stdio.h>
shared int *p1;
int *p2;
shared int arr[8]={0,1,2,3,4,5,6,7};
int main()
{
p1=&arr[3];
p2=(int *)p1;
// 线程间接引用指针 p1 将会访问数组元素 arr[3]
printf("Th: %d,*p1=%d\n",MYTHREAD,*p1);
//p1 指针所在的线程对指针 p2 间接引用将访问数组元素 arr[3]
if(MYTHREAD == upc_threadof(p1))
printf("Th: %d,*p2=%d\n",MYTHREAD,*p2);
return 0;
}
|
图 23 清单 15 程序输出: 指向私有数据指针转换为指向共享数据指针一个指向私有数据的指针不可以转换为指向共享数据指针,除非是将一个常量表达式 0 转换为指向共享数据指针。这种情况下,结果为一个指向共享数据类型的空指针,如清单 16 例子所示
清单 16. 指向共享数据类型的空指针1
2
3
4
5
6
7
8
9
10
| # include <upc.h>
int i;
shared int *p1;
int *p2=0;
void main ()
{
p1=0; // legal
p1=p2; // 不合法,编译器报错
p1=&i; // 不合法,编译器报错
}
|
图 24. 清单 16 程序输出 指向私有数据指针转换为指向私有数据指针指向私有数据指针与 C 语言中的普通指针相似,因此,指向私有数据指针之间的转换可以参照 C 语言中指针之间的转换规则,此处不作赘述。
结语UPC 语言中的指针分为指向私有数据私有类型指针,指向共享数据私有类型指针,指向私有数据共享类型指针,指向共享数据共享类型指针。其中,我们不鼓励用户使用指向私有数据共享类型指针。指向私有数据私有类型指针相当于 C 语言中的普通指针,特点是速度快。而指向共享数据私有类型指针和指向共享数据共享类型指针,速度要比指向私有数据私有类型指针慢得多。从程序的性能优化考虑,尽量使用指向私有数据私有类型指针,或者是使用与被访问数据具有亲缘关系指针 |
|
|
|
|
|