Linux環境多線程(C語言)

1.多線程的概念
    每個進程都有自己的數據段、代碼段和堆棧段,這就造成進程在創建、切換、撤銷操作時候,需要較大的系統開銷。
    爲了減少系統開銷,從進程中演化出來線程。
    線程存在於進程中,共享進程的資源。
    線程是進程中的獨立控制流,由環境(包括寄存器組和程序計數器)和一系列的指令組成,每個進程有一個地址空間和一個控制線程(主線程)。

    其實我覺得,進程相當於一個生產工廠,工廠裏面的流水線相當於線程,因爲進程不共享很多資源,就相當於新建廠房,每個廠房有自己的物料管理,而線程相當於一個工廠裏面的流水線,所以可以共享一個同一個工廠裏面的物料。

                               線程A棧
                               線程B棧
                               堆區
                               BSS區
                              數據區
                              代碼區

                                                                                               進程

 

2.線程創立pthread_create

  每個進程都有對應的進程,是一個非負的整數,數據類型爲pid_t ,而線程也有對應的線程號,數據類型爲pthread_t (這個不一定是整形,在有些操作系統裏面,使用結構體表示,有些系統當成整形數據類型來處理),線程號在系統中不是唯一的,線程號只在他所屬的進程環境中有效,線程只在他所處的那個進程裏面,線程號纔是唯一的。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

功能:創建一個線程

參數:thread:線程標識符

          attr:線程屬性結構體的地址,一般用默認屬性,傳一個NULL

         start_routine;線程函數的入口地址,這個地方利用的就是C語言的函數指針

         arg:傳給線程函數的參數

返回值:成功返回0 ,失敗返回非0.

與fork不同的是,pthtrad_create 創建的線程不與父線程在同一點執行,而是從指定的函數開始運行,該函數運行完,該線程就退出了。(意思是父子進程都是在fork之後開始執行),線程是依賴於進程 的,進程結束,線程也就結束了,並且線程函數 的程序在pthread庫中,所以鏈接時候加上參數 -lpthred 

示例代碼:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>

void * thread_func1(void * args )
{  
	while( 1)
	{  
		printf("pthread1 \n ");
		sleep( 1);
	}
		
}
void * thread_func2(void *args )
{  
	while( 1)
	{  
		printf("pthread2 \n ");
		sleep( 1);
	}
}

int main(int argc,char *argv[])
{
	pthread_t tid1,tid2;
	int ret = 0;
	ret = pthread_create(&tid1,NULL,thread_func1,NULL );
	if( ret !=0)
	{
		perror( "pthread_cretae 1 error \n ");
		return -1;
	}
	
	ret = pthread_create(&tid2,NULL,thread_func2,NULL );
	if( ret !=0)
	{
		perror( "pthread_cretae 2  error \n ");
		return -1;
	}
	while(1); // 這個地方加while(1)死循環,是保證進程不死,這樣的話,就可以去執行我們創建的哪兩個線程,如果不加,進程死亡,那麼我們創建的那兩個線程也不會執行的。
	return 0;
}   	
    	
		
    	

2.多線程傳參

多線程傳參,是通過指針,args的參數類型爲void * ,所以可以接收任意的數據類型的指針,但是在線程函數裏面使用傳過來的參數的時候,需要進行強制類型轉換。

譬如:創建線程的時候ret = pthread_create(&tid1,NULL,thread_func1,"helo world" ); 這個“hello world"就會作爲參數傳給線程函數。

線程函數就可以使用傳過來的這個參數:

void * thread_func1(void * args )
{  
	printf("%s \n",(char *)args);
	while( 1)
	{  
		printf("pthread1 \n ");
		sleep( 1);
	}
		
}


        
        
        

 

 

 

 

 

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