@mwumli
2015-05-19T06:29:43.000000Z
字数 1264
阅读 1981
SPLOS OSEP
SPLOS 语言是一个小型并发语言,在语言层面实现并发
SPLOS 语言提供了关键字 parallel 来进行并发操作
多个任务在某一时间段同时执行,就是并发执行
如果多个并发任务对同一共享变量操作,会出现数据混乱的操作
比如:
int i = 1;void func1() {i++;}void func2() {i++;}void func3() {i++;}int main() {parallel {func1();func2();func3();}return 0;}
运行结果可能是: 2 或 3 或 4
因为并发时,执行的顺序是不确定的,由系统进行调度
暂且认为任务的执行次序是func1, func2, func3
那么:
如果结果是4, 则
此时i = 1, 运行func1的i++, 结果2 写入内存;
此时i = 2, 运行func2执行i++, 结果3写入内存;
此时i = 3, 运行func4执行i++, 结果4写入内存;
此时i = 4, 这是最终结果
如果结果是3, 则
此时i = 1, 运行func1的i++, 结果2还未写入内存;
此时i = 1, 运行func2的i++, 结果2写入内存, func1的结果2也写入内存;
此时i = 2, 运行func3的i++, 结果3写入内存;
此时i = 3, 这是最终结果
如果结果是2, 则
此时i = 1, 运行func1的i++, 结果2还未写入内存;
此时i = 1, 运行func2的i++, 结果2还未写入内存;
此时i = 1, 运行func3的i++, 结果2写入内存,func1的结果2写入内存, func2的结果2写入内存;
此时i = 2, 这是最终结果
paralel {func1();func2();func3();}
说明:
1. parallel 语句内部为并发区域块
2. parallel 语句块中的三个函数会开启3个并发任务
3. parallel 目前仅支持函数调用的并
发
4. parallel 的并发通信,通过全局变量
int ses1;int ses2;int ses3;void getSquare(int x, int y){ses1 = x * y;}void factorial(int n){int i;if(n <= 0) {ses1 = -1;} else {i = 1;ses2 = 1;while(i < n) {ses2 = ses2 * i;i = i + 1;}}}void accumulation(int n){int i;if(n <= 0) {ses1 = -1;} else {i = 1;ses2 = 0;while(i <= n) {ses2 = ses2 + i;i = i + 1;}}}int main(){parallel{getSquare(2, 23);factorial(10);accumulation(5);}return 0;}
说明:
1. parallel 进入并发模式
2. getSquare, factorial, accumulation 将是3个并发任务
3. 并发任务的结果,最终会放入ses1, ses2, ses3中