程序设计语言 9.0分
读书笔记 我们能够见到的几种创建线程的语法
[已注销]

co-begin par begin p(a, b, c), begin d := q(e, f); r(d, g, h) end, s(i, j) end 在algol68里这段代码会被3个线程并行执行。并发的个数是程序掌控的。(注:par指名这个block可以并行执行) 并行循环 co (i :=5 to 10) -> p(a, b, i) oc 在SR里以上代码的并发个数是6。并且程序员需要保证并发执行的安全性。 这个让我想到了openMP…… 加工时启动 procedure P is task T is ... end T; begin -- P ... end P; ADA中上面这段代码会在启动P的时候,启动一个T的Task (注:P与T并行)。并且P控制流到达P最后的时候,会等待task T的结束。 void* T(void* arg){ ... return NULL; } int main(){ pthread_t pid; pthread_create(&pid, NULL, T, NULL); pthread_join(pid, NULL); return 0; } 上面这段是fork/join的模式。与加工时启动的最大不同之处就是fork/join更一般,相比前面3种方式的控制流,fork/join的控制流能够更随意更不受约束,它可以导致任意的并发控制流……当然,也可能更危险。:) 隐式接收 如RPC等,给了client在server段建立并行控制流的能力。 早回复 跟continuation有点像。 书中的图给的还是比较给力的 | | | \ call \ | | | | / / return | + 单线程调用子程序(图1) | | | wait .\ fork . \ . | . | . | . | . + . / ./join | + fork之后,主线程就开始join等待子线程,控制流与图1基本是无异的(图2) | | | fork wait.\ . \ . | . | . | . |reply . /| / | | | | + + (图3) fork之后,控制流进入子线程,主线程在wait,等待子线程的reply。当子线程reply的时候,控制流分成2个,一个返回主线程,一个从reply处继续进行。 话说如果我始终只有一个控制流,从子线程返回了,这个时候再保存了子线程的continuation。恩恩 另外早回复是有着这样的场景的。如果父线程希望等待子线程做了一些初始化工作以后,自己才继续进行。

0
《程序设计语言》的全部笔记 5篇
豆瓣
免费下载 iOS / Android 版客户端