線程:
定義:一個程序中的多個執行路線叫做線程,線程是一個進程內部的控制序列。
所有的進程都至少有一個執行線程(初始線程)。
初始線程隨進程的創建而創建,其他線程則需要通過顯式的函數調用來創建。
進程與線程
當進程執行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);
}