Linux線程
線程
1.1 線程概述
1.2 線程常用API

線程方法使用
創建線程
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
//返回值:若成功返回0,否則返回錯誤編號
詳情介紹:
??當pthread_create成功返回時,由tidp指向的內存單元被設置為新創建線程的線程ID。attr參數用于定制各種不同的線程屬性,暫可以把它設置為NULL,以創建默認屬性的線程。
??新創建的線程從start_rtn函數的地址開始運行,該函數只有一個無類型指針參數arg。如果需要向start_rtn函數傳遞的參數不止一個,那么需要把這些參數放到一個結構中,然后把這個結構的地址作為arg參數傳入。
3.線程等待
線程被阻塞
#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
// 返回值:若成功返回0,否則返回錯誤編號
調用這個函數的線程將一直阻塞,直到指定的線程調用pthread_exit、從啟動例程中返回或者被取消。如果線程簡單地從它的啟動例程返回,rval_ptr將包含返回碼。如果線程被取消,由rval_ptr指定的內存單元就置為PTHREAD_CANCELED。
??可以通過調用pthread_join自動把線程置于分離狀態,這樣資源就可以恢復。如果線程已經處于分離狀態,pthread_join調用就會失敗,返回EINVAL。
4.線程ID獲取及比較
#include <pthread.h>
pthread_t pthread_self(void);
//返回值:調用線程的ID
創建線程并且打印出它的id
demo.cpp
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *func1(void *arg)
{
printf("t1:%ld thread is create\n",(unsigned long)pthread_self());
// 將void*強制轉換成int*然后解引用
printf("t1:param is %d\n",*((int*)arg));
}
int main()
{
int ret;
int param = 100;
pthread_t t1;
// int *pret = NULL;
int pret;
ret = pthread_create(&t1,NULL,func1,(void*)¶m);
if(ret==0)
{
printf("main:create t1 success\n");
}
// 等待線程結束后退出
pthread_join(t1,(void**)&pret);
printf("main:t1 quit:%d\n",pret);
return 0;
}
編譯執行
g++ -o demo demo.cpp -pthread
編譯 C++ 程序時,-pthread 是一個編譯器選項,用于告訴編譯器鏈接 POSIX 線程庫,也就是通常所說的線程庫。在 Linux 系統中,這個選項是編譯多線程程序時必須的。
當你在編譯命令中加入 -pthread 選項時,它通常需要出現在編譯命令的兩個地方:
在編譯(但不鏈接)時,例如 g++ -pthread -c demo.cpp,這告訴編譯器包含線程相關的代碼和頭文件。
在鏈接時,例如 g++ -pthread demo.o -o demo,這告訴鏈接器鏈接線程庫。

驗證共享變量
線程是共享進程的空間的,所以進程中的變量也是共享的,進行驗證
寫一個共享變量,然后每個線程都給這個變量加1;
變量等于3的時候退出,這樣有可能會拿不到3
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
//這個是共享的變量
int g_data = 0;
void *func1(void *arg)
{
printf("t1:%ld thread is create\n",(unsigned long)pthread_self());
printf("t1:param is %d\n",*((int *)arg));
while(1){
//修改共享變量
printf("t1: %d\n",g_data++);
sleep(1);
if(g_data == 3){
pthread_exit(NULL);
}
}
}
void *func2(void *arg)
{
printf("t2:%ld thread is create\n",(unsigned long)pthread_self());
printf("t2:param is %d\n",*((int *)arg));
while(1){
//修改共享的變量
printf("t2: %d\n",g_data++);
sleep(1);
}
}
int main()
{
int ret;
int param = 100;
pthread_t t1;
pthread_t t2;
ret = pthread_create(&t1, NULL, func1,(void *)¶m);
if(ret == 0){
printf("main:create t1 success\n");
}
ret = pthread_create(&t2, NULL, func2,(void *)¶m);
if(ret == 0){
printf("main:create t2 success\n");
}
printf("main:%ld\n",(unsigned long)pthread_self());
while(1){
printf("main: %d\n",g_data++);
sleep(1);
}
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}

共享空間了,但是執行順序可能不同
要使用鎖,來讓這個變量遞增。

浙公網安備 33010602011771號