官术网_书友最值得收藏!

1.2.4 Alef——Phil Winterbottom,1993

在Go語言出現之前,Alef語言是比較完美的并發語言,Alef語法和運行時基本是無縫兼容C語言。Alef語言對線程并發體和進程并發體都提供了支持,其中proc receive(c)以線程方式啟動一個并發體,task receive(c)以線程方式啟動一個并發體,它們之間通過通道c進行通信。不過,由于Alef語言同時支持進程并發體和線程并發體,而且在并發體中可以再次啟動更多的并發體,因此Alef的并發狀態異常復雜。同時Alef沒有自動垃圾收集機制(Alef保留的C語言靈活的指針特性也導致自動垃圾收集機制實現比較困難),各種資源充斥于不同的線程和進程之間,導致并發體的內存資源管理也異常復?雜。

Alef語言只在Plan 9系統中得到過短暫的支持,其他操作系統中并沒有實際可以運行的Alef開發環境。關于Alef語言的資料也只有Plan 9 Programmer’s Manual(Plan 9程序員手冊)中的“Alef Language Reference Manual”(Alef語言參考手冊)和“Alef User’s Guide”(Alef用戶指南)部分,因此在貝爾實驗室之外關于Alef語言的討論并不?多。

圖1-5展示了Alef用戶指南中給出的一個可能的并發體狀?態。

圖1-5 Alef并發模型

Alef語言并發版本的“Hello, World”程序如下:

#include <alef.h>
void receive(chan(byte*) c) {
    byte *s;
    s = <- c;
    print("%s\n", s);
    terminate(nil);
}
void main(void) {
    chan(byte*) c;
    alloc c;
    proc receive(c);
    task receive(c);
    c <- = "hello proc or task";
    c <- = "hello proc or task";
    print("done\n");
    terminate(nil);
}

程序開頭的#include <alef.h>語句用于包含Alef語言的運行時庫。receive()是一個普通函數,用作程序中每個并發體的入口函數;main()函數中的alloc c語句先創建一個chan(byte*)類型的通道,類似Go語言的make(chan []byte)語句;然后分別以進程和線程的方式運行receive()函數,啟動并發體;啟動并發體之后,main()函數向c通道發送了兩個字符串數據;而以進程和線程狀態運行的receive()函數會以不確定的順序先后從通道收到數據后,分別打印字符串;最后每個并發體都通過調用terminate(nil)來結束自?己。

Alef的語法和C語言基本保持一致,可以認為它是在C語言的語法基礎上增加了并發編程相關的特性,可以看作是另一個維度的C++語?言。

主站蜘蛛池模板: 军事| 绩溪县| 中山市| 曲水县| 河池市| 南溪县| 德兴市| 清新县| 金昌市| 涪陵区| 天门市| 专栏| 镇宁| 顺平县| 桃园市| 栾川县| 合山市| 宁津县| 宾阳县| 文昌市| 科技| 广安市| 亳州市| 太仓市| 瑞安市| 句容市| 英超| 边坝县| 双峰县| 墨脱县| 城口县| 合作市| 辽阳市| 林周县| 抚顺市| 缙云县| 建宁县| 杭州市| 寻乌县| 凌海市| 马公市|