1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # include <upc.h> // 假定由四个线程来运行该程序 # include <stdio.h> shared int a; int main() { if(MYTHREAD == 0)// 由线程 0 来对变量 a 进行初始化 { a=-1; } upc_barrier; // 在所有线程执行到此语句之前,任何线程不得向下执行。这保证了每个线程看到 a // 的最新的初始值 -1. 假设此处没有 upc_barrier 语句的话,下面各个线程所输出 a 的值很 // 可能不一样。 printf("Th=%d,a=%d\n",MYTHREAD,a); // 每个线程输出变量 a 的值 return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <upc.h> // 假定由四个线程来运行该程序 #include <stdio.h> shared int a; int main(void) { if(MYTHREAD == 0) { a=1; } if(MYTHREAD == 0) // 此处会引起运行错误, 因为线程 0 的 upc_barrier 语句的整型表达式为 1, // 而对于其他线程(线程 1,线程 2,线程 3),所调用的 upc_barrier 语句 // 的整型表达式为 2. upc_barrier 1; // 整型表达式为 1 else upc_barrier 2; // 整型表达式 2 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # include <upc.h> // 假定 5 个线程来运行该程序 # include <stdio.h> shared int a; int b=0; int main() { if(MYTHREAD == 0) { a=-1; } upc_notify; // 执行此 upc_notify 语句的线程将会通知其他线程它已经执行到此处的 // upc_notify 语句 b +=MYTHREAD; // 在 upc_notify 和 upc_wait 之间,线程可以执行一些不需要与其他线程进行同步的计 // 算,这样可以充分地利用线程等待的时间,提高程序的效率。 upc_wait ; // 执行到 upc_wait 语句的线程会停下来,直到所有线程执行到这里才能继续向下执行。 printf("Th=%d,a=%d,b=%d\n",MYTHREAD,a,b); // 所有线程输出 a 和 b 的值。 我们可以看到上面 // upc_notify 和 upc_wait 语句的使用确保所 // 有的线程中的 a 与 b 值是最新的 return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # include <upc.h> // 假定 5 个线程来运行该程序 # include <stdio.h> int main() { if(MYTHREAD == 0) upc_notify 1; else upc_notify 2; // 该语句与 upc_wait 1 不匹配 upc_wait 1; upc_notify 1; if(MYTHREAD == 0) upc_wait 1; else upc_wait 2; // 该语句与 upc_notify 1 不匹配 return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | # include <upc.h> # include <stdio.h> # define SUCCESS 0 # define FAILURE 1 # define verify(result,expect) \ { if ((result)!=(expect)) \ { \ printf("Error: fail at line %d: mythread=%d, result= %d, expect= %d\n",\ __LINE__, MYTHREAD, result,expect); \ upc_global_exit(FAILURE); \ } \ } shared int A[THREADS]; int main() { int i=0; A[MYTHREAD]=MYTHREAD; upc_fence; // 此处的 upc_fence 语句确保了执行该语句的线程在继续向下执行之前,将之前所有对共 // 享数据的读写执行完毕 verify(A[MYTHREAD],MYTHREAD); // 验证数组元素 A[MYTHREAD] 的值是否等于 MYTHREAD if(MYTHREAD == 0) // 如果执行的线程是线程 0 的话,将元素 A[0] 的值更新为 99 { A[MYTHREAD]=99; } upc_fence; // 在执行过此处的 upc_fence 语句之后,线程 0 中的元素 A[0] 的值应该是 99,而不是 0 if(MYTHREAD == 0) // 线程 0 来验证元素 A[0] 的值是否为 99 { verify(A[MYTHREAD],99); } return SUCCESS; } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |