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++多线程,消息队列用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 营口银行存50万安全吗?利息有多少?
- 下一篇: 电脑用linux命令大全,电脑操作时常用