日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux c++ queue 多线程,C++多线程,消息队列用法

發布時間:2023/12/10 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux c++ queue 多线程,C++多线程,消息队列用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

進程是沒有活力的,它只是一個靜態的概念。為了讓進程完成一些工作,進程必須至少占有一個線程,所以線程是描述進程內的執行,正是線程負責執行包含在進程的地址空間中的代碼。實際上,單個進程可以包含幾個線程, 它們可以同時執行進程的地址空間中的代碼。為了做到這一點,每個線程有自己的一組CPU寄存器和堆棧。

線程是進程內部的一個執行單元。系統創建好進程后,實際上就啟動執行了該進程的主執行線程,主執行線程以函數地址形式,比如說main或WinMain函數,將程序的啟動點提供給Windows系統。主執行線程終止了,進程也就隨之終止。

每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其它線程,多個線程并發地運行于同一個進程中。一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統資源,所以線程間的通訊非常方便,多線程技術的應用也較為廣泛。

多線程可以實現并行處理,避免了某項任務長時間占用CPU時間。要說明的一點是,目前大多數的計算機都是單處理器(CPU)的,為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU時間,操作系統以輪換方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。由此可見,如果兩個非常活躍的線程為了搶奪對CPU的控制權,在線程切換時會消耗很多的CPU資源,反而會降低系統的性能。這一點在多線程編程時應該注意。

現代操作系統大都提供了相應的機制,用來處理線程的生存期、同步,以及其他“和線程有關”的屬性,如優先級、線程專有存儲空間(thread-specific storage)等。多線程編程是一門語言的難點和重點。

接下來讓我們看看處理線程的函數:pthread_create()函數,創建線程函數原型如下:int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void*), void *restrict arg);參數講解:1、每個線程都有自己的ID即thread ID,可以簡稱tid,呵呵,是不是想起什么來了?……對,和pid有點象。其類型為pthread_t,pthread_t在頭文件/usr/include/bits/pthreadtypes.h中定義:typedef unsigned long int pthread_t;可以看成是線程的標志符。當成功創建一個新線程的時候,系統會為該線程分配一個tid,并將該值通過指針返回給調用它的程序。

2、attr申明線程的屬性。

屬性結構為pthread_attr_t,它在頭文件/usr/include/pthread.h中定義。設為NULL,表示在這里我們只使用線程的默認屬性就可以了。

3、start_routine表示新創建的線程所要執行的例程。線程以調用該函數開始,直到由該函數返回(return)終止這個線程,或者在start_routine所指向的函數中調用pthread_exit函數終止。start_routine只有一個參數,該參數由隨后的arg指針來指出。

4、arg:也是一個指針,也就是start_routine指針所指向的函數的參數。

返回值:當pthread_create調用成功時,該調用返回0;否則,返回一個錯誤代碼指出錯誤的類型。

pthread_exit()函數線程的終止可以是調用了pthread_exit或者該線程的例程結束。也就是說,一個線程可以隱式的退出,也可以顯式的調用pthread_exit函數來退出。

函數原型如下:void pthread_exit( void * value_ptr );線程的終止可以是調用了pthread_exit或者該線程的例程結束。也就是說,一個線程可以隱式的退出,也可以顯式的調用pthread_exit函數來退出pthread_exit函數唯一的參數value_ptr是函數的返回代碼,只要pthread_join中的第二個參數value_ptr不是NULL,這個值將被傳遞給value_ptr pthread_join()函數,等待一個線程終止調用pthread_join的線程將被掛起直到參數thread所代表的線程終止時為止。pthread_join是一個線程阻塞函數,調用它的函數將一直等到被等待的線程結束為止。

函數原型如下:int pthread_join(pthread_t th, void **thread_return);如果value_ptr不為NULL,那么線程thread的返回值存儲在該指針指向的位置。該返回值可以是由pthread_exit給出的值,或者該線程被取消而返回PTHREAD_CANCELED.當一個非分離的線程終止后,該線程的內存資源(線程描述符和棧)并不會被釋放,直到有線程對它使用了pthread_join時才被釋放。因此,必須對每個創建為非分離的線程調用一次pthread_join調用,以避免內存泄漏。否則當線程是可分離的,調用pthread_exit,將終止該調用線程,并釋放所有資源,沒有線程等待它終止。

至多只能有一個線程等待給定的線程終止。如果已經有一個線程在等待thread線程終止了,那么再次調用pthread_join等待同一線程的線程將返回一個錯誤

linux下多線程的實現方法:1)使用全局變量? 2)不使用全局變量?? 3)線程相關的數據實例1

#include #include #include

#define MAXLENGTH 20

void another_func(const char* threadName)

{ printf("%s is running in another_func\n",threadName);}

void * thread_func(void *args)

{ char threadName[MAXLENGTH];strncpy(threadName,(char*)args,MAXLENGTH-1);

printf("%s is running in thread_func\n",threadName);another_func(threadName);}

int main(int argc,char* argv[])

{ pthread_t pa,pb;pthread_create(&pa, NULL, thread_func, "Thread A");pthread_create(&pb, NULL, thread_func, "Thread B");

pthread_join(pa, NULL);pthread_join(pb, NULL);return 0;}輸出結果為:Thread A is running in thread_func Thread A is running in another_func Thread B is running in thread_func Thread B is running in another_func

41/41234>

總結

以上是生活随笔為你收集整理的linux c++ queue 多线程,C++多线程,消息队列用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。