一個thread對象就表明一個線程執行,當對象建立完成後,線程函數就開始執行,下面這段話是c++11的thread類介紹。css
An initialized thread object represents an active thread of execution; Such a thread object is joinable, and has a unique thread id.ios
A default-constructed (non-initialized) thread object is not joinable, and its thread id is common for all non-joinable threads.c++
A joinable thread becomes not joinable if moved from, or if either join or detach are called on them.markdown
須要注意的是:當一個線程對象是joinable狀態時,對象在析構前須要使用detach或者jion函數。函數
如今寫代碼證明這段話,加深c++11 thread類的使用,具體代碼以下:ui
#include "stdafx.h"
#include <memory>
#include <string>
#include <iostream>
#include <thread>
void pause_thread(int nSleepTime)
{
//std::cout << "pause for: " << nSleepTime << "\n";
std::this_thread::sleep_for(std::chrono::seconds(nSleepTime));
}
int main()
{
//thread1和thread2 是初始化的線程對象,它是joinable狀態而且有惟一的id;
std::thread thread1(pause_thread, 1);
std::thread thread2(pause_thread, 2);
//thread3是未初始化的線程對象,它是非joinable狀態,id不惟一
std::thread thread3;
//驗證代碼
if (thread1.joinable())
{
std::cout <<"thread1 is joinable" << std::endl;
}
if (thread2.joinable())
{
std::cout << "thread2 is joinable" << std::endl;
}
if (!thread3.joinable())
{
std::cout << "thread3 is not joinable" << std::endl;
}
std::cout << "***********分割線*****************\n\n" << std::endl;
std::cout << "thread1: " << thread1.get_id() << std::endl;
std::cout << "thread2: " << thread2.get_id() << std::endl;
std::cout << "thread3: " << thread3.get_id() << std::endl;
//thread objects that are joinable shall either be joined
// or detached before they are destroyed.
thread1.join();
thread2.detach();
std::cout << "*************分割線****************\n\n" << std::endl;
//A joinable thread becomes not joinable if moved from,
//or if either join or detach are called on them.
if (!thread1.joinable())
{
std::cout << "thread1 becomes not joinable" << std::endl;
}
if (!thread2.joinable())
{
std::cout << "thread2 becomes not joinable" << std::endl;
}
return 0;
}
運行結果:
this