Linux下C++11的線程類用法(可連接線程和可分離線程thread)

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頁

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