linux多線程學習筆記二---基本線程編程

一,線程常見函數介紹
#include<stdio.h>
#include<pthread.h>
void *thread_routine(void *arg)
{
	pthread_t tid=pthread_self();
	printf("thread 1 say hello\n");
	return arg;
}
int main()
{
	pthread_t thread_id;
	void * thread_result;
	int status;
	status=pthread_create(&thread_id,NULL,thread_routine,NULL);
	if(status!=0)
	{
		printf("create error\n");
		return 1;
	}
	status=pthread_join(thread_id,&thread_result);
	if(status!=0)
	{
		printf("join error\n");
		return 1;
	}
	if(thread_result==NULL)
		return 0;
	else
		return 1;
}
首先看上面這個例子,簡單的創建一個線程,在線程中打印thread 1 say hello。
首先分析上面程序涉及的函數。
1,創建線程,線程通過調用pthread_create函數來創建其他線程,原型如下:
#include <pthread.h>
typedef void*(func)(void*);
int pthread_create(pthread_t *tid, const pthread_attr_t *attr,func *f, void *arg);      若成功返回0,若出錯則非0
當pthread_create返回時,參數tid包含新創建線程的ID,新線程可以通過pthread_self函數獲取自己線程的ID。
#include <pthread.h>
pthread_t pthread_self();  
2,回收終止線程的資源
線程通過調用pthread_join函數等待其他線程終止
#include <pthread.h>
int pthread_join(pthread_t tid,void **thread_retrun);  若成功返回0,出錯則非零
pthread_join函數會阻塞,直到線程tid終止,然後回收已終止線程佔用的所有存儲器資源。
除此還要熟悉一下幾個函數
#include <pthread.h>
int pthread_detach(pthread_t tid); 
int pthread_exit(void*thread_return);
int pthread_cancel(pthread_t);  

pthread_detach()函數用於指示應用程序在線程tid終止時回收其存儲空間。如果tid尚未終止,pthread_detach()不會終止該線程。

一個線程是以一下方式之一來終止的:當頂層的線程例程返回時,線程會隱式的終止;通過調養pthread_exit函數顯式的終止,該函數返回一個指向thread_return的指針。如果主線程調用pthread_exit,它會等待所有其他對等線程終止,然後再終止主線程和整個進程,返回值爲thread_return。對等線程也可以調用pthread_cancel來終止當前線程。

二,線程的生命週期

通常將線程的狀態分爲以下幾種:就緒,運行,阻塞,終止,狀態轉移圖如下所示。

線程的創建,上例中status=pthread_create(&thread_id,NULL,thread_routine,NULL);完成線程的創建工作,線程創建注意:pthread_create函數返回同線程執行之間沒有同步關係,被創建之後進入就緒狀態。線程啓動,即開始執行pthread_routine函數。通常線程在以下情況被阻塞:試圖加鎖一個已經鎖住的互斥量;等待某個條件變量;執行無法立即完成的I/O操作。程序中pthread_join函數處阻塞,等待它創建的線程結束。線程終止,本例中線程pthread_routine線程資源在pthread_join函數返回時被回收。而pthread_detach分離的線程在線程結束時自動被回收。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章