C 多執行緒處理資料

2021-07-25 16:53:31 字數 1467 閱讀 4477

os:centos 7

編譯環境:gcc 4.8

cpu: 2顆 intel(r) xeon(r) cpu e5-2670 v3 @ 2.30ghz,24核48執行緒。

int pthread_create(pthread_t *thread,

const pthread_attr_t *restrict_attr,

void*(*start_rtn)(void*),

void *restrict arg);

引數:

第乙個引數*thread為指向執行緒識別符號的指標。

第二個引數*restrict_attr用來設定執行緒屬性,上面也可以用null,表示使用預設的屬性。

第三個引數是執行緒執行函式的起始位址。

最後乙個引數是執行函式的引數,null表示無引數

返回0表示建立成功,否則返回錯誤號。

int pthread_join(pthread_t thread, void **retval);
pthread_join()函式,以阻塞的方式等待thread指定的執行緒結束。當函式返回時,被等待執行緒的資源被收回。如果程序已經結束,那麼該函式會立即返回。並且thread指定的執行緒必須是joinable的。

引數 :

thread: 執行緒識別符號,即執行緒id,標識唯一執行緒。

retval: 使用者定義的指標,用來儲存被等待執行緒的返回值。

返回值 : 0代表成功。 失敗,返回的則是錯誤號。

最簡單的idea就是將資料進行劃分,比如開闢

n 個執行緒,每乙個執行緒處理不同的資料,考慮到執行緒建立和執行緒**的時間,最容易想到的方法就是開始建立

n個執行緒,直到所有的執行緒處理完資料以後,主線程條用join方法,等待所有子執行緒結束。

多執行緒的處理需要注意,執行緒之間會不會訪問同一塊記憶體,執行緒之間是否相互影響。

例如下執行緒建立**:

93

for(int i = 0; i < threadnum; i++)

94

100 }

i的值是自增的,如果傳遞指標的話,每乙個執行緒都會使用i的位址,那麼在子執行緒中i的值就不是確定的。所以就會出現潛在的錯誤。

50

void *function(void *arg)

51

如果資料不可劃分,那訪問資料將會是互斥的,那麼每次只會有單執行緒進行訪問,並且執行緒切換還需要加鎖操作,倒不如單執行緒處理。

在本次實驗中,我開闢了30個執行緒,使用top命令,可以看出cpu的使用率,如圖所示:

各個cpu都在並行的處理資料,整體處理速度大大的提高。

C 多執行緒處理List資料

思路 將要處理的資料放到concurrentqueue中,然後開啟多個執行緒去處理資料,處理完成後,再到佇列中獲取下乙個待處理資料。concurrentqueue表示執行緒安全的先進先出 fifo 集合,屬於system.collections.concurrent命名空間下的乙個資料結構 直接上 ...

C 多執行緒處理

region 變數初始化 string tx 任務執行緒分派數 每次設定一組 一組十個執行緒 任務執行緒 限制最多十個執行緒 long threadcount 0 long maxthreadcount 10 manualreseteventslim manual new manualresetev...

C 多執行緒處理基礎

cpu 處理器 或者核心 核心是實際執行程式的硬體單元。程序是某個程式當前正在執行的例項 作業系統的一項基本功能就是管理程序。每個程序都包含乙個或多個執行緒。程式中可以使用system.diagnostics命名空間的process類的例項來訪問程序。在語句和表示式的級別上,c 本質上就是在描述控制...