C 的多執行緒裡的事件是怎樣定義的,事件和執行緒有啥聯絡和區別

時間 2022-05-22 13:00:03

1樓:匿名使用者

在程式設計領域,所謂同步就是指你要等待一個過程(呼叫,任務,事件等)執行完畢後才能進行下一步操作;而非同步則相反,你不需要等待它執行完畢就可以繼續進行其它操作了。

那麼,在單核多執行緒的平臺上,在邏輯上看:執行緒 a 發起(發射,呼叫)過程 p 之後不等待而繼續執行 p1,由執行緒 b 執行過程 p,p1 和 p 被任為是同時執行的;在時序上看,作業系統來**度執行緒 a 和 b 給它們分配時間片,所以 cpu 在某個時刻要麼在執行 p1 要麼在執行 p —— 一會兒執行 p1 一會兒執行 p(併發)。

單執行緒非同步與這個情況類似,只不過是過程拆分粒度的區別,最大的拆分粒度就是:執行緒 a 先發起了過程 p 之後繼續執行過程 p1,p1 整體執行完畢後,回過頭來再執行 p。所以,在單執行緒裡你無法 wait 一個還沒有被執行的過程 —— 一旦你 wait 它,它就沒有機會執行了,這是一個 dead lock。

除了執行緒之外還有一個協程(coroutine)的概念,可以人為的(顯式的)把一個過程拆分為多個**片段,從而多個過程可以在同一條執行緒裡穿插執行。

有時候,一個同步操作實際上是非同步操作+等待操作的封裝,舉個例子:當你在一個檔案上呼叫 read 操作時,作業系統發起磁碟操作後暫時將呼叫執行緒掛起,等資料從磁碟載入到記憶體之後,恢復執行緒繼續執行。雖然我們沒有寫 wait,但實際上等待發生了。

在多核多執行緒平臺上,執行緒 a 和 b 有機會被分配到不同的核心上執行,那麼過程 p1 和 p 真的可以同時執行(並行)。

實現上的區別,一是邏輯問題,二是執行緒安全問題。

2樓:熬夜

事件就是函式,一個事件佇列就是一個存放函式的容器。

c++ 多執行緒與c多執行緒有什麼區別? 10

3樓:匿名使用者

c++ 支援多純種程式設計的, 你現在用的很多軟體就是 c++ 多純程編出來的 。

4樓:匿名使用者

據我所知,現有的c++標準並沒有內建的多執行緒,但是並不排除以後的c++標準支援多執行緒,就更別說是c的多執行緒了;我想你所說的是基於某一平臺下的c++或者c多執行緒吧?

5樓:尚品團

沒有區別,因為c++和c都支援原生多執行緒

6樓:du瓶邪

所有資料結構的生存期,以及對這些資料結構的access,都用這一根邏輯執行緒。不需要考慮資料結構的race。把任何耗時的操作都給其他執行緒(io執行緒、定時器執行緒,db執行緒等)做,做完之後向事件佇列(多執行緒安全的佇列,其他執行緒是生產者,邏輯執行緒是消費者)丟事件。

多執行緒邏輯設計的思路:

所有資料結構的生存期,以及對這些資料結構的access,不一定在一根執行緒。需要考慮資料結構的race。網路事件、定時器事件喚醒工作執行緒(一般通過iocp或者epoll來喚醒)執行所有工作,一般不需要交換到其他執行緒。

很顯然,單執行緒邏輯多了一層事件佇列交換,會增加延遲,以及所有的邏輯都在一根執行緒上跑,邏輯被阻塞也會帶來延遲。其實吞吐量對於rpc來說,是個巨集觀的概念,儘可能快地消費網路訊息就會提升吞吐量。對於高併發的程式,是無法忍受單執行緒邏輯的

7樓:匿名使用者

沒什麼區別,都是c的方法

c語言多執行緒和c++多執行緒有區別嗎

8樓:徐茹臧帆

1、epoll處理併發事件,多執行緒處理併發業務。

2、poll是linux核心為處理大批量檔案描述符而作了改進的poll,是linux下多路複用io介面select/poll的增強版本,它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率。另一點原因就是獲取事件的時候,它無須遍歷整個被偵聽的描述符集,只要遍歷那些被核心io事件非同步喚醒而加入ready佇列的描述符集合就行了。epoll除了提供select/poll那種io事件的水平觸發(level

triggered)外,還提供了邊緣觸發(edgetriggered),這就使得使用者空間程式有可能快取io狀態,減少epoll_wait/epoll_pwait的呼叫,提高應用程式效率。

為什麼c++ 多執行緒的事件物件的問題 **如下

9樓:愛漢語

#define thread_num 5//為什麼執行緒數需要在這裡定義?

這是定義了一個全域性變數吧,也可以用其他的方法定義,方法不是唯一的。

10樓:周生

1 #define thread_num 5 是個巨集定義,預編譯的時候編譯器把所有的thread_num都替換為5。所以,你可以直接用5代替thread_num。巨集定義的好處在於你想修改這個值,只用在巨集定義出修改該而不用每個地方都修改一遍

2 i確實是到4就結束了,因為你的迴圈條件時這麼控制的,你再看看for迴圈裡的條件就明白了

11樓:匿名使用者

50 / 10 = 5

你需要在closehandle(hthread[i])前用waitformultipleobjects等待子執行緒退出。具體用法問度娘。

而且 closehandle(hthread[i]) //這裡陣列越界

for(i=0; i

c#非同步和多執行緒有什麼區別和聯絡? 5

12樓:匿名使用者

非同步和多執行緒可以說沒有必然的聯絡,只能說非同步可以通過多執行緒實現而已

要理解這些東西,你得具備很多相關的知識,作業系統原理,編譯原理等

簡單地來說,計算機或者說cpu執行你的**都是順序執行的,當前的語句沒有執行完,不會執行後面的語句的,這是永遠不變的規則!

但是這樣的機制會使整個執行效率很低,因為cpu總是要等待當前的語句執行完畢了才會執行後面的**,而計算機在絕多數的時候都是處於等待使用者的輸入,等待磁碟檔案的讀取完成,等待網路資料的傳輸完成中,所以為了提高整個系統的執行效率,提高cpu的執行效率,計算機系統引入了非同步的機制。

非同步機制,簡單地說就是cpu不會傻傻地處於等待狀態,它會先幹別的事情,當它需要的東西已經準備完畢後(大多數的情況都是等待外部的輸入資料準備完畢,也有些是複雜的計算完畢),硬體系統給cpu一箇中斷,告訴有了新的資料了,你現在可以去處理了。

這就是最基本的非同步原理,而現代操作作業系統對硬體系統做了良好的封裝,把很多底層機制遮蔽了,為程式的開發者提供了事件和多執行緒的概念,讓程式的開發者可以更好地利用非同步機制。

再說說多執行緒吧。多執行緒是計算機引入了作業系統之後才有的概念,至於為什麼計算機要引入作業系統,在此就不敘述了,自行了解。多執行緒的實現有兩個方法,一個就是增加cpu的核數和個數,這是最直接的方法,還有一種是採用cpu輪詢的方式,每個程序都執行一段時間,又去執行另一個程序的指令,由於切換的速度非常的快,給人的感覺就是同時執行的。

說了這麼多,你可能很失望,因為沒有**,沒有舉例。但我想說的是,用**無法說明這個問題,不同的作業系統,不同的程式語言,不同的程式設計框架,對非同步和多執行緒的定義和處理是不一樣的,但原理就是這樣的。

我們寫**無非就是寫一堆的指令去要求cpu執行,同步的方式就是這樣的:

我:hi,cpu,我要你做一件事情,而且必須立刻馬上就做,因為我正在等著你。

cpu:那你就等著吧,我現在去做。

非同步的方式是這樣的:

我:hi,cpu,我要你做一件事情,但是不是立刻就做,你可以交給下面的人去做,或者找一個幫手來,我們繼續做後面的事情.

cpu:好的,我現在通知硬體去做,等有結果了我通過事件告訴你

或者cpu:好的,我讓另一個核心來做這件事情,我們繼續(其實多執行緒是作業系統實現的,我只是這麼舉個例子而已)

什麼是執行緒、什麼又是多執行緒 它們之間有什麼區別呢?

13樓:匿名使用者

樓主的「雙執行緒」是指的「超執行緒技術」吧?那其實是一個核心執行兩個執行緒而已,而雙核才是真正有兩個核心,當然也要快得多。

14樓:騰訊電腦管家

執行緒是程序的一個實體,是cpu排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源.

一個執行緒可以建立和撤銷另一個執行緒;同一個程序中的多個執行緒之間可以併發執行!

15樓:愛荷珠

執行緒(thread)是程序內部的一個執行單元,它是程式中一個單一的順序控制流程。

執行緒又被稱為輕量級程序(lightweight process)如果在一個程序中同時執行了多個執行緒,用來完成不同的工作,則稱之為多執行緒

多執行緒(multithreading),是指從軟體或者硬體上實現多個執行緒併發執行的技術。具有多執行緒能力的計算機因有硬體支援而能夠在同一時間執行多於一個執行緒,進而提升整體處理效能。

c 的執行緒和程序的區別,C 多執行緒多程序問題

執行緒是指程序內的一個執行單元,也是程序內的可排程實體.與程序的區別 1 地址空間 程序內的一個執行單元 程序至少有一個執行緒 它們共享程序的地址空間 而程序有自己獨立的地址空間 2 資源擁有 程序是資源分配和擁有的單位,同一個程序內的執行緒共享程序的資源 3 執行緒是處理器排程的基本單位,但程序不...

c 多執行緒加鎖的問題,C 執行緒中方法可以加鎖嗎?

lock是鎖住執行緒吧,用protect和final不給呼叫算不。恩,可以的。先定義lock物件。object objlock new object 在lock塊中呼叫一個函式。lock objlock 可以啊 放在lock塊裡。還有一種執行緒同步一系統的方法。比如用monitor mutex一系統...

請問linux下C程式設計多執行緒同步和非同步的區別,如何能實現程式的同步和非同步程式設計

同步就是使得兩個或者多個程序之間的行為按照一定的時序來執行。比如說執行緒a完成了某件事,然後執行緒b才能做某件事。具體一點,就是,執行緒間的某個動作執行前需要確認一個或者多個其他執行緒的當前狀態。而非同步則是多個執行緒各跑各的,互不干涉。linux下的多執行緒實現由pthread庫提供,標頭檔案為p...