您好,登錄后才能下訂單哦!
創建一個線程:
進程,是并發執行的程序在執行過程中分配和管理資源的基本單位,是一個動態概念,竟爭計算機系統資源的基本單位。每一個進程都有一個自己的地址空間,即進程空間或(虛空間)。進程空間的大小 只與處理機的位數有關,一個 16 位長處理機的進程空間大小為 216 ,而 32 位處理機的進程空間大小為 232 。進程至少有 5 種基本狀態,它們是:初始態,執行態,等待狀態,就緒狀態,終止狀態。
線程,在網絡或多用戶環境下,一個服務器通常需要接收大量且不確定數量用戶的并發請求,為每一個請求都創建一個進程顯然是行不通的,——無論是從系統資源開銷方面或是響應用戶請求的效率方面來看。因此,操作系統中線程的概念便被引進了。線程,是進程的一部分,一個沒有線程的進程可以被看作是單線程的。線程有時又被稱為輕權進程或輕量級進程,也是 CPU 調度的一個基本單位。
關系:進程擁有一個完整的虛擬地址空間,不依賴于線程而獨立存在;反之,線程是進程的一部分,沒有自己的地址空間,與進程內的其他線程一起共享分配給該進程的所有資源。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
Compile and link with -pthread.
1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 void* thread_run(void* id) 5 { 6 while(1) 7 { 8 printf("this is a thread\n"); 9 sleep(1); 10 } 11 return (void*)0; 12 } 13 14 int main() 15 { 16 pthread_t tid; 17 int ret=pthread_create(&tid,NULL,thread_run,NULL); 18 while(1) 19 { 20 printf("this is main thread\n"); 21 sleep(2); 22 } 23 return 0; 24 }
運行結果:兩個線程同時執行自己代碼
2.線程等待:int pthread_join(pthread_t thread, void **retval);(以阻塞形式等待)
Compile and link with -pthread.
1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 void* thread_run(void* id) 5 { 6 int count=5; 7 while(count--) 8 { 9 printf("this is a thread\n"); 10 sleep(1); 11 } 12 return (void*)0; 13 } 14 15 int main() 16 { 17 pthread_t tid; 18 int ret=pthread_create(&tid,NULL,thread_run,NULL); 19 int count=10; 20 while(count--) 21 { 22 printf("this is main thread\n"); 23 sleep(2); 24 } 25 void* retval=0; 26 pthread_join(tid,&retval); 27 printf("retval: %d\n",(int)retval); 28 return 0; 29 }
3.線程終止(4種)
(1)exit(1)直接終止進程
1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 void* thread_run(void* id) 5 { 6 int count=5; 7 while(count--) 8 { 9 printf("this is a thread\n"); 10 sleep(1); 11 } 12 exit(1); 13 } 14 15 int main() 16 { 17 pthread_t tid; 18 int ret=pthread_create(&tid,NULL,thread_run,NULL); 19 int count=10; 20 while(count--) 21 { 22 printf("this is main thread\n"); 23 sleep(2); 24 } 25 void* retval=0; 26 pthread_join(tid,&retval); 27 printf("retval: %d\n",(int)retval); 28 return 0; 29 }
運行結果
(2)pthread_exit((void*)s);
#include <pthread.h>
void pthread_exit(void *retval);
Compile and link with -pthread.
1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 void* thread_run(void* id) 5 { 6 int count=5; 7 int ret=3; 8 while(count--) 9 { 10 printf("this is a thread\n"); 11 sleep(1); 12 } 13 pthread_exit((void*)ret); 14 } 15 16 int main() 17 { 18 pthread_t tid; 19 int ret=pthread_create(&tid,NULL,thread_run,NULL); 20 int count=10; 21 while(count--) 22 { 23 printf("this is main thread\n"); 24 sleep(2); 25 } 26 void* retval=0; 27 pthread_join(tid,&retval); 28 printf("retval: %d\n",(int)retval); 29 return 0; 30 }
(3)線程可被取消:
#include <pthread.h>
int pthread_cancel(pthread_t thread);
Compile and link with -pthread.
a.被自己取消
1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 void* thread_run(void* id) 5 { 6 int count=5; 7 while(count--) 8 { 9 printf("this is a thread\n"); 10 sleep(1); 11 } 12 pthread_cancel(pthread_self()); 13 } 14 15 int main() 16 { 17 pthread_t tid; 18 int ret=pthread_create(&tid,NULL,thread_run,NULL); 19 int count=10; 20 while(count--) 21 { 22 printf("this is main thread\n"); 23 sleep(2); 24 } 25 void* retval=0; 26 pthread_join(tid,&retval); 27 printf("retval: %d\n",(int)retval); 28 return 0; 29 }
b.被主線程取消
1 #include<stdio.h> 2 #include<pthread.h> 3 #include<stdlib.h> 4 void* thread_run(void* id) 5 { 6 int count=5; 7 while(count--) 8 { 9 printf("this is a thread\n"); 10 sleep(1); 11 } 12 } 13 14 int main() 15 { 16 pthread_t tid; 17 int ret=pthread_create(&tid,NULL,thread_run,NULL); 18 int count=3; 19 while(count--) 20 { 21 printf("this is main thread\n"); 22 sleep(1); 23 } 24 pthread_cancel(tid); 25 void* retval=0; 26 pthread_join(tid,&retval); 27 printf("retval: %d\n",(int)retval); 28 return 0; 29 }
1 #include<stdio.h> 2 #include<pthread.h> 3 void* pthread_run1(void* arg) 4 { 5 int count=5; 6 while(count--) 7 { 8 printf("this is a pthread,id: %d, pthread_id:%u\n",(int)arg,pthread_ self()); 9 } 10 return (void*)1; 11 } 12 void* pthread_run2(void* arg) 13 { 14 int count=5; 15 while(count--) 16 { 17 printf("this is a pthread,id: %d, pthread_id:%u\n",(int)arg,pthread_ self()); 18 } 19 pthread_exit((void*)2); 20 } 21 void* pthread_run3(void* arg) 22 { 23 int count=5; 24 while(count--) 25 { 26 printf("this is a pthread,id: %d, pthread_id:%u\n",(int)arg,pthread_ self()); 27 } 28 pthread_cancel(pthread_self()); 29 } 30 int main() 31 { 32 pthread_t tid1,tid2,tid3; 33 pthread_create(&tid1,NULL,pthread_run1,(void*)1); 34 pthread_create(&tid2,NULL,pthread_run2,(void*)2); 35 pthread_create(&tid3,NULL,pthread_run3,(void*)3); 36 void* ret=NULL; 37 pthread_join(tid1,&ret); 38 printf("pthread_id: %u,ret: %d\n",tid1,(int)ret); 39 pthread_join(tid2,&ret); 40 printf("pthread_id: %u,ret: %d\n",tid2,(int)ret); 41 pthread_join(tid3,&ret); 42 printf("pthread_id: %u,ret: %d\n",tid3,(int)ret); 43 return 0; 44 }
線程的分離:在任何一個時間點上, 線程是可結合的( joinable)或者是分離的( detached) 。一個可結合的線程能夠被其他線程收回其資源和殺死。在被其他線程回收之前,它的存儲器資源(例如棧)是不釋放的。 相反, 一個分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在它終止時由系統自動動釋放。
1 #include<pthread.h> 2 #include<stdio.h> 3 void* pthread_run(void* arg) 4 { 5 int count=5; 6 while(count--) 7 { 8 printf("this is thread\n"); 9 sleep(1); 10 } 11 } 12 int main() 13 { 14 pthread_t tid; 15 pthread_create(&tid,NULL,pthread_run,NULL); 16 void* ret=NULL; 17 pthread_detach(tid); 18 sleep(1); 19 pthread_join(tid,&ret); 20 printf("ret: %d,errstring:%s\n",(int)ret,strerror((int)ret)); 21 }
在設置分離后,依舊等待退出,會返回錯誤碼。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。