一个thread对象就代表一个线程执行,当对象创建完成后,线程函数就开始执行,下面这段话是c++11的thread类介绍。
An initialized thread object represents an active thread of execution; Such a thread object is joinable, and has a unique thread id.
A default-constructed (non-initialized) thread object is not joinable, and its thread id is common for all non-joinable threads.
A joinable thread becomes not joinable if moved from, or if either join or detach are called on them.
需要注意的是:当一个线程对象是joinable状态时,对象在析构前需要使用detach或者jion函数。
现在写代码证实这段话,加深c++11 thread类的使用,具体代码如下:
#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;
}
运行结果: