@mwumli
2015-05-19T14:29:43.000000Z
字数 1264
阅读 1747
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中