并發(fā)性是使程序在同一時(shí)間運(yùn)行一個(gè)以上的線程。并發(fā)程序的一個(gè)例子是在Web服務(wù)器響應(yīng)多個(gè)客戶(hù)端在同一時(shí)間。并發(fā)是容易與消息傳遞卻很難,如果它們是基于數(shù)據(jù)共享的寫(xiě)入。
傳遞線程之間的數(shù)據(jù)被稱(chēng)為消息。消息可以由任何類(lèi)型和任意數(shù)量的變量。每個(gè)線程都有一個(gè)ID,它是用于指定郵件的收件人。即啟動(dòng)另一個(gè)線程的任何線程被稱(chēng)為新線程的所有者。即啟動(dòng)另一個(gè)線程的任何線程被稱(chēng)為新線程的所有者。
spawn() 接受一個(gè)函數(shù)指針作為參數(shù),并從該函數(shù)啟動(dòng)一個(gè)新線程。正在開(kāi)展的功能,包括它可能調(diào)用其他函數(shù)的任何操作,將在新的線程中執(zhí)行。owner和worker開(kāi)始獨(dú)立執(zhí)行的,好像他們是獨(dú)立的程序:
import std.stdio; import std.stdio; import std.concurrency; import core.thread; void worker(int a) { foreach (i; 0 .. 4) { Thread.sleep(1); writeln("Worker Thread ",a + i); } } void main() { foreach (i; 1 .. 4) { Thread.sleep(2); writeln("Main Thread ",i); spawn(&worker, i * 5); } writeln("main is done."); }
當(dāng)上面的代碼被編譯并執(zhí)行,它在讀取上一節(jié)中創(chuàng)建的文件,并產(chǎn)生以下結(jié)果:
Main Thread 1 Worker Thread 5 Main Thread 2 Worker Thread 6 Worker Thread 10 Main Thread 3 main is done. Worker Thread 7 Worker Thread 11 Worker Thread 15 Worker Thread 8 Worker Thread 12 Worker Thread 16 Worker Thread 13 Worker Thread 17 Worker Thread 18
thisTid變量是全局可用在模塊級(jí)始終是當(dāng)前線程的id。也可以收到重生時(shí)被調(diào)用threadid。一個(gè)例子如下所示。
import std.stdio; import std.concurrency; void printTid(string tag) { writefln("%s: %s, address: %s", tag, thisTid, &thisTid); } void worker() { printTid("Worker"); } void main() { Tid myWorker = spawn(&worker); printTid("Owner "); writeln(myWorker); }
當(dāng)上面的代碼被編譯并執(zhí)行,它在讀取上一節(jié)中創(chuàng)建的文件,并產(chǎn)生以下結(jié)果:
Owner : Tid(std.concurrency.MessageBox), address: 10C71A59C Worker: Tid(std.concurrency.MessageBox), address: 10C71A59C Tid(std.concurrency.MessageBox)
send() 發(fā)送的消息和receiveOnly()等待一個(gè)特定類(lèi)型的消息。還有prioritySend(),receive()和receiveTimeout(),這將在后面進(jìn)行說(shuō)明。在下面的程序的所有者將其工作者int類(lèi)型的消息,并等待來(lái)自double類(lèi)型的工人消息。線程繼續(xù)發(fā)送郵件來(lái)回,直到車(chē)主發(fā)出了一個(gè)負(fù)的int。一個(gè)例子如下所示。
import std.stdio; import std.concurrency; import core.thread; import std.conv; void workerFunc(Tid tid) { int value = 0; while (value >= 0) { value = receiveOnly!int(); auto result = to!double(value) * 5; tid.send(result); } } void main() { Tid worker = spawn(&workerFunc,thisTid); foreach (value; 5 .. 10) { worker.send(value); auto result = receiveOnly!double(); writefln("sent: %s, received: %s", value, result); } worker.send(-1); }
當(dāng)上面的代碼被編譯并執(zhí)行,它在讀取上一節(jié)中創(chuàng)建的文件,并產(chǎn)生以下結(jié)果:
sent: 5, received: 25 sent: 6, received: 30 sent: 7, received: 35 sent: 8, received: 40 sent: 9, received: 45
一個(gè)簡(jiǎn)單的例子與傳遞與等待消息如下所示。
import std.stdio; import std.concurrency; import core.thread; import std.conv; void workerFunc(Tid tid) { Thread.sleep(上一篇:D語(yǔ)言范圍