多線程在項目開發中使用頻率高,使用多線程能夠提高程序的并發性
提高程序的并發性:1.多線程,對系統資源的消耗更小一些
2.多進程
系統的cpu資源有線,cpu時間片被分好后,由系統進行調度,每個線程在執行的時候都需要搶這個cpu的時間片。如果搶到了,就執行,如果沒搶到,就處于一個就緒態,就緒態的線程沒有cpu的使用權 ,搶到cpu的時間片后,就處于運行態
linux里的多線程
線程概述
線程是輕量級的進程(LWP:light weight process),在Linux環境下線程的本質仍是進程。在計算機上運行的程序是一組指令及指令參數的組合,指令按照既定的邏輯控制計算機運行。操作系統會以進程為單位,分配系統資源,可以這樣理解,進程是資源分配的最小單位,線程是操作系統調度執行的最小單位。
先從概念上了解一下線程和進程之間的區別:
進程有自己獨立的地址空間, 多個線程共用同一個地址空間
線程更加節省系統資源, 效率不僅可以保持的, 而且能夠更高
在一個地址空間中多個線程獨享: 每個線程都有屬于自己的棧區, 寄存器(內核中管理的)
在一個地址空間中多個線程共享: 代碼段, 堆區, 全局數據區, 打開的文件(文件描述符表)都是線程共享的
線程是程序的最小執行單位, 進程是操作系統中最小的資源分配單位
每個進程對應一個虛擬地址空間,一個進程只能搶一個CPU時間片
一個地址空間中可以劃分出多個線程, 在有效的資源基礎上, 能夠搶更多的CPU時間片
在處理多任務程序的時候使用多線程比使用多進程要更有優勢,但是線程并不是越多越好,如何控制線程的個數呢?
文件IO操作:文件IO對CPU是使用率不高, 因此可以分時復用CPU時間片, 線程的個數 = 2 * CPU核心數 (效率最高)
處理復雜的算法(主要是CPU進行運算, 壓力大),線程的個數 = CPU的核心數 (效率最高)
2.創建線程
只要是線程都有唯一一個線程id,id類型為pthread_t
pthread_t pthread_self(void); // 返回當前線程的線程ID
在一個進程中調用線程創建函數,就可得到一個子線程,和進程不同,需要給每一個創建出的線程指定一個處理函數,否則這個線程無法工作。
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
// Compile and link with -pthread, 線程庫的名字叫pthread, 全名: libpthread.so libptread.a
pthread_t *thread傳出參數
const pthread_attr_t *attr,線程屬性
void *(*start_routine) (void *)函數指針,做會調用的,指針所指向的函數,就是在子線程里要執行的任務
void *arg任務函數的參數
回調函數,是由線程去調用的,而不是由程序員去調用的,因此程序員只需要把回調函數的任務寫出來
2.2 創建線程
下面是創建線程的示例代碼,在創建過程中一定要保證編寫的線程函數與規定的函數指針類
型一致:void *(*start_routine) (void *):
// pthread_create.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>// 子線程的處理代碼
void* working(void* arg)
{printf("我是子線程, 線程ID: %ld\n", pthread_self());for(int i=0; i<9; ++i){printf("child == i: = %d\n", i);}return NULL;
}int main()
{// 1. 創建一個子線程pthread_t tid;pthread_create(&tid, NULL, working, NULL);printf("子線程創建成功, 線程ID: %ld\n", tid);// 2. 子線程不會執行下邊的代碼, 主線程執行printf("我是主線程, 線程ID: %ld\n", pthread_self());for(int i=0; i<3; ++i){printf("i = %d\n", i);}// 休息, 休息一會兒...// sleep(1);return 0;
}