[关闭]
@mwumli 2015-05-19T14:29:43.000000Z 字数 1264 阅读 1747

SPLOS语言 -- parallel并发

SPLOS OSEP


SPLOS 语言是一个小型并发语言,在语言层面实现并发

SPLOS 语言提供了关键字 parallel 来进行并发操作

并发执行

多个任务在某一时间段同时执行,就是并发执行

特点

  1. 并发任务执行顺序不确定
  2. 并发任务如果未对共享区域作出保护,共享区域的结果不确定

并发执行的影响

如果多个并发任务对同一共享变量操作,会出现数据混乱的操作

比如:

  1. int i = 1;
  2. void func1() {
  3. i++;
  4. }
  5. void func2() {
  6. i++;
  7. }
  8. void func3() {
  9. i++;
  10. }
  11. int main() {
  12. parallel {
  13. func1();
  14. func2();
  15. func3();
  16. }
  17. return 0;
  18. }

运行结果可能是: 2 或 3 或 4

因为并发时,执行的顺序是不确定的,由系统进行调度
暂且认为任务的执行次序是func1, func2, func3
那么:

  1. 如果结果是4, 则
    此时i = 1, 运行func1的i++, 结果2 写入内存;
    此时i = 2, 运行func2执行i++, 结果3写入内存;
    此时i = 3, 运行func4执行i++, 结果4写入内存;
    此时i = 4, 这是最终结果

  2. 如果结果是3, 则
    此时i = 1, 运行func1的i++, 结果2还未写入内存;
    此时i = 1, 运行func2的i++, 结果2写入内存, func1的结果2也写入内存;
    此时i = 2, 运行func3的i++, 结果3写入内存;
    此时i = 3, 这是最终结果

  3. 如果结果是2, 则
    此时i = 1, 运行func1的i++, 结果2还未写入内存;
    此时i = 1, 运行func2的i++, 结果2还未写入内存;
    此时i = 1, 运行func3的i++, 结果2写入内存,func1的结果2写入内存, func2的结果2写入内存;
    此时i = 2, 这是最终结果

parallel的使用

  1. paralel {
  2. func1();
  3. func2();
  4. func3();
  5. }

说明:
1. parallel 语句内部为并发区域块
2. parallel 语句块中的三个函数会开启3个并发任务
3. parallel 目前仅支持函数调用的并

4. parallel 的并发通信,通过全局变量

程序示例

  1. int ses1;
  2. int ses2;
  3. int ses3;
  4. void getSquare(int x, int y)
  5. {
  6. ses1 = x * y;
  7. }
  8. void factorial(int n)
  9. {
  10. int i;
  11. if(n <= 0) {
  12. ses1 = -1;
  13. } else {
  14. i = 1;
  15. ses2 = 1;
  16. while(i < n) {
  17. ses2 = ses2 * i;
  18. i = i + 1;
  19. }
  20. }
  21. }
  22. void accumulation(int n)
  23. {
  24. int i;
  25. if(n <= 0) {
  26. ses1 = -1;
  27. } else {
  28. i = 1;
  29. ses2 = 0;
  30. while(i <= n) {
  31. ses2 = ses2 + i;
  32. i = i + 1;
  33. }
  34. }
  35. }
  36. int main()
  37. {
  38. parallel{
  39. getSquare(2, 23);
  40. factorial(10);
  41. accumulation(5);
  42. }
  43. return 0;
  44. }

说明:
1. parallel 进入并发模式
2. getSquare, factorial, accumulation 将是3个并发任务
3. 并发任务的结果,最终会放入ses1, ses2, ses3中

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注