C 多執行緒問題

2021-09-26 21:21:23 字數 2900 閱讀 7135

多執行緒問題,用法其實並不難,難的是在複雜的場景用不好,多執行緒的用法大家能知道幾個?thread? threadtool?

下面我們詳細講一下多執行緒的歷程:

.net framework 1.0    thread

最初版本多執行緒thread, 功能非常豐富也很強大,但是呢也很容易出錯,主要是多執行緒是從作業系統中拿的,如果執行緒太多,很容易系統卡死。你遍歷迴圈執行一萬個thread你看一下肯定要崩潰。

我們簡單展示一下多執行緒thread的簡單用法:

threadstart ts = new threadstart(new program().getage);

thread th = new thread(ts);

th.start();

th.abort(); //終止執行緒

public void getage()

, age: ");

}

確保沒有輸入引數,沒有返回引數

.net framework 2.0    threadpool

2.0之後呢引入threadpool這樣乙個概念,所有執行緒從執行緒池中獲取,執行緒池可以設定最大執行緒數量,這樣呢就不會影響系統執行緒被濫用導致系統卡死,但是有乙個問題,threadpool 支援的功能 非常少,就導致了也是不很滿足,下面我們簡單用一下theadpool:

waitcallback wcb = new waitcallback(new program().getage);

threadpool.queueuserworkitem(wcb,"join");

public void getage(object kk)

.net framework 3.0 task

目前來說,在實踐的過程中最為好用的就是task,功能強大,而且也不會擔心執行緒太多導致系統卡死,因為2.0版本的影響後續所有的執行緒都放到了執行緒池中,隱藏的很好,執行緒池會動態的啟用以及釋放掉。

我們看下task的用法:

task.run(() => ");

});task.run(getage);

task.waitany();

task.waitall();

public static void getage()

waitany()  代表如果任何乙個執行緒執行完就往下一步執行, waitall() 等所有執行緒執行完才進行下一步操作,會阻塞主線程,值得注意的是,task主線程也會參與計算,而不是像theadpool 這種 全部分配給子執行緒來進行計算

.net framework 4.0 parallel

4.0版本出現了乙個parallel  在某些情況呢是非常好用的,功能也不強大但適用某些場景,簡單**:

parallel.invoke(() => );

listactionlist = new list();

actionlist.add(getage);

actionlist.add(() =>

);parallel.invoke(actionlist.toarray());

public static void getage()

parallel 還支援很多foreach 、for操作

.net framework new    func<> action<> 為什麼是new 我也懶得查是那個版本出來的

action<>  和 func<>  作為委託不同之處在於 action針對無返回值的方法   func針對有返回值的方法,直接看例子吧

// action

actionage = new action(getage);

asynccallback ac = ack =>

, this is real success");

};iasyncresult result = age.begininvoke(18, ac, "mom");

result.asyncwaithandle.waitone(1000);

console.writeline($", this is real success. again");

console.writeline("this is success");

// func

funcagevalue = new func(getagevalue);

asynccallback acvalue = ack =>

, this is real success");

};iasyncresult resultvalue = agevalue.begininvoke(18, acvalue, "mom");

console.writeline(age);

if (!resultvalue.iscompleted)

resultvalue.asyncwaithandle.waitone(1000);

console.writeline($"result : ");

console.writeline(resultvalue);

console.writeline($", this is real success. again");

console.writeline("this is success");

console.readline();

public static void getage(int age)

public static string getagevalue(int age)

";}

以後再維護吧。。。。。。。。。。

C 多執行緒問題

多執行緒問題,一直是我的乙個噩夢,老是搞不清楚怎麼回事,真是很慚愧呀,所以今天特地向各位的大大求教。如下 c include www.h include include include include include include pthread cond t cond pthread mutex...

多執行緒問題C

1.過去寫的微控制器裸跑的程式,其實也屬於多執行緒的,用智慧型電表中的韌體做個比方。void main void 迴圈中,所列包括3個 執行緒 處理,執行緒1在執行完之後執行執行緒2,執行緒2執行完進入執行緒3.後面依次,此類我覺得也可稱之 執行緒 由於不必存在同時處理的問題,因此不存在爭搶同一共享...

c 多執行緒問題

synchronizationcontext的物件不是所有執行緒都被附加的,只有ui主線程會被附加。synchronizationcontext物件。這個對像的用處就是可以記錄乙個 主 執行緒的上下文然後再子執行緒處理完之後,要用到主線程去操作的時候可以去post或者send乙個事件去解決 send...