【Linux】學習微操作系統,Linux多線程

線程:

定義:一個程序中的多個執行路線叫做線程,線程是一個進程內部的控制序列。

所有的進程都至少有一個執行線程(初始線程)。

初始線程隨進程的創建而創建,其他線程則需要通過顯式的函數調用來創建。

 

進程與線程

當進程執行fork()調用時,將創建該進程的一份完整拷貝,該進程擁有自己
的PID和變量,獨立調度,執行(幾乎)獨立於父進程。

新線程擁有自己獨立的棧(eg.局部變量),但與創建者共享全局變量、文
件描述符、信號句柄、當前目錄狀態。
線程併發性

程序呈現出同時做多件事情的特性(併發性)。

 

線程的狀態

就緒態:線程能夠運行,正在等待處理機資源。可能剛啓動,或被其他線程
搶佔處理器,或從阻塞態恢復。

阻塞態:線程由於等待某些條件而無法運行,例如IO、加鎖互斥量或其他條
件。

運行態:正在運行。在多處理機系統中,可能有多個線程處於運行態。

終止態:線程從起始函數返回、或調用pthread_exit()函數、或被取消。
線程由一套完整的函數庫支持,其中絕大部分函數以“pthread_”開頭。

爲了使用這些庫函數,代碼中必須定義_REENTRANT宏。

程序中要包含頭文件pthread.h。

編譯時需要使用-lpthread選項

測試代碼:

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

int run_now = 1;
char message[] = "Hello World";

void *thread_function(void *arg) 
{
	int print_count2 = 0;

	while(print_count2++ < 20) 
	{
		if (run_now == 2) 
		{
			printf("2\n");
			run_now = 1;
		}
		else 
		{
			sleep(1);
		}
	}
	sleep(3);
}


int main() 
{
	int res;
	pthread_t a_thread;
	void *thread_result;
	int print_count1 = 0;   

	res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
	if (res != 0) 
	{
		perror("Thread creation failed");
		exit(EXIT_FAILURE);
	}

	while(print_count1++ < 20) 
	{
		if (run_now == 1) 
		{
			printf("1\n");
			run_now = 2;
		}
		else 
		{
			sleep(1);
		}
	}

	printf("\nWaiting for thread to finish...\n");
	res = pthread_join(a_thread, &thread_result);
	if (res != 0) 
	{
		perror("Thread join failed");
		exit(EXIT_FAILURE);
	}
	printf("Thread joined\n");
	exit(EXIT_SUCCESS);
}


 

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