Linux下調用多線程有兩種方式,一種是利用POSIX線程庫,一種是用C++11中的線程類,本文用的是後者。其中,Linux下用C++11創建多線程分爲可連接的和不可連接的。
可連接線程:需要調用thread成員函數thread::join()阻塞等待線程結束並且回收資源;thread默認創建的線程是可連接線程!
不可連接線程(也就是分離線程):直接調用thread::detach()即可在線程結束後自動回收資源。
函數pthread_exit(NULL)(放在主函數裏面)表示主線程結束後,該線程所在進程並不會立即結束,要等所有線程結束後主進程纔會結束。
下面將分別列舉可連接線程和分離線程實例。
實例1 創建一個可連接線程,並傳入字符串
步驟1:在Linux目錄下新建一個文件名爲thread_input_char.cpp空白文件,輸入下列代碼:
#include <iostream>
#include <thread>
using namespace std;
void thfunc(char *s)
{
cout<<"child thread char =="<< s << "\n"; //打印傳入的字符串
}
int main(int argc, char *argv[])
{
char s[] = "I am a main thread char";
thread t(thfunc,s); //創建線程,傳入線程函數,帶字符串
t.join();
return 0;
}
步驟2:在終端terminal輸入下列命令,生成可執行程序thread_input_char,然後運行可執行程序,結果如下圖所示:
g++ -o thread_input_char thread_input_char.cpp -lpthread -std=c++11
實例2 創建一個分離線程,並且傳入結構體和多個變量
步驟1:在Linux目錄下新建一個文件名爲thread_input_struct.cpp空白文件,輸入下列代碼:
#include <iostream>
#include <thread>
using namespace std;
typedef struct //
{
int num;
const char *str; //z
}MYSTRUCT;
void thfunc(void *arg, int m, int *k, char s[])
{
MYSTRUCT *p = (MYSTRUCT*)arg; //
cout<<"child thread p->num =="<< p->num <<"\nchild thread p->str =="<< p->str<<endl; //d
cout<<"child thread m =="<<m<<"\nchild thread k =="<<*k<<"\nchild thread str =="<<s<<endl; //
*k=7777;
}
int main(int argc, char *argv[])
{
MYSTRUCT mystruct; //d
mystruct.num = 666;
mystruct.str = "I am a struct";
int m=300,k=12;
char str[]="I am a string";
thread t(thfunc,&mystruct,m,&k,str); //s
t.detach(); //
cout<<"changed value k =="<<k<<endl; //7777
pthread_exit(NULL); //
cout<<"I can not run!"<<endl;
return 0;
}
步驟2:在終端terminal輸入下列命令,生成可執行程序thread_input_char,然後運行可執行程序,結果如下圖所示:
g++ -o thread_input_struct thread_input_struct.cpp -lpthread -std=c++11
參考內容:
《Linux C與C++ 一線開發實踐》 397-399頁