1、前言
在启动一个线程时,我们首先需要定义一个线程执行体,这个可执行体可以是函数、仿函数或者lambda表达式。并且它们可以拥有任意数量的参数。如,
auto thHandler = std::thread([](){cout << "a new thread" << endl;});
以上一行代码运行时,会启动一个新的线程,线程的执行体为一个lambda表达式,这个线程会在控制台中高输出“a new thread“。以上的示例中,lambda没有参数,但是实际上线程执行体可以有任意个参数,而我们知道参数传递有引用传递、指针传递以及按值传递之分。通常,在传对象时一般建议使用引用传递,但是我们有必要知道如何正确的在线程执行体中使用引用传递。
2、参数采用引用传递的效果
在继续之前,我们先来看看采用引用传递方式的效果,如以下代码:
void changeName(string & strOldName, const string& strNewName)
{
cout << "Name passed in: " << strOldName << endl;
strOldName = strNewName;
cout << "Now name changed to : " << strOldName << endl;
}
int main()
{
string strName("old name");
auto thHandler = std::thread(changeName, strName, "new name");
thHandler.join();
cout << "After name changed in thread, now become : " << strName << endl;
return 0;
}