多執行緒之向執行緒傳遞引數

2022-04-12 10:46:57 字數 1154 閱讀 4491

建立物件,初始化物件中的一些值,然後在start()方法中呼叫該物件方法

通過lambda表示式

thread.start方法

static

void count(object

iterations)

static

void countnumbers(int

iterations)

prints

", thread.currentthread.name, i);}}

static

void printnumber(int

number)

class

threadsample

public

void

countnumbers()

prints

", thread.currentthread.name, i);}}

}

static

void main(string

args)

當主程式啟動時,首先建立了threadsample類的乙個物件,並提供了乙個迭代次數。然後使用該物件的countnumbers方法啟動執行緒。該方法執行在另乙個執行緒中,但是使用數字10,該數字是通過threadsample物件的建構函式傳入的。因此,我們只是使用相同的間接方式將該迭代次數傳遞給另乙個執行緒。

接下來的方式是使用lambda表示式。lambda表示式定義了乙個不屬於任何類的方法。我們建立了乙個方法,該方法使用需要的引數呼叫了另乙個方法,並在另乙個執行緒中執行該方法。當啟動threadthree執行緒時,列印出了12個數字,這正是我們通過lambda表示式傳遞,的數字。

使用lambda表示式引用另乙個c#物件的方式被稱為閉包。當在lambda表示式中使用任何區域性變數時, c#會生成乙個類,並將該變數作為該類的乙個屬性。所以實際上該方式與 threadone執行緒中使用的一樣,但是我們無須定義該類, c#編譯器會自動幫我們實現。

這可能會導致幾個問題。例如,如果在多個lambda表示式中使用相同的變數,它們會共享該變數值。在前乙個例子中演示了這種情況。當啟動threadfour和threadfive執行緒時,.它們都會列印20,因為在這兩個執行緒啟動之前變數被修改為20。

管理執行緒之向執行緒函式傳遞引數

向執行緒函式傳遞引數在構造執行緒物件時就可以完畢。可是要記住,預設情況下是把引數複製到執行緒內部,即使在函式中使用的是引用。比如 void f int i,std string const s std thread t f,3,hello 上面 中,函式f的第二個引數是std string,傳遞的是...

管理執行緒之向執行緒函式傳遞引數

向執行緒函式傳遞引數在構造執行緒物件時就可以完畢。可是要記住,預設情況下是把引數複製到執行緒內部,即使在函式中使用的是引用。比如 void f int i,std string const s std thread t f,3,hello 上面 中,函式f的第二個引數是std string,傳遞的是...

多執行緒 引數傳遞

4,unique ptr作為引數傳遞,必須使用move函式 5,函式的指標作為引數傳遞 引用傳遞,指標傳遞的注意事項 因為執行緒2裡使用的是執行緒1的變數a,所以如果執行緒1比執行緒2提前結束了,結束的同時就會釋放變數a的記憶體空間,可是這時執行緒2還沒結束,再去訪問執行緒1中的變數a的話,就會發生...