在C ++ 11中,“不代表执行线程”的线程有什么意义?

时间:2011-09-26 03:20:58

标签: c++ multithreading c++11

查看C ++ 11中新的线程内容,看看它映射到pthreads的容易程度,我注意到thread构造函数区域中的奇怪部分:

  

螺纹();
  效果:构造一个不代表执行线程的线程对象   后置条件: get_id()== id()
  投掷:没什么。

换句话说,线程的默认构造函数实际上似乎创建一个线程。显然,它创建了一个线程对象,但是如果没有支持代码,它究竟是多么有用呢?有没有其他方法可以将“执行线程”附加到该对象,如thrd.start()或类似的东西?

4 个答案:

答案 0 :(得分:35)

  

还有其他方法可以将“执行线程”附加到该对象,例如thrd.start()或类似的东西吗?

// deferred start
std::thread thread;

// ...

// let's start now
thread = std::thread(functor, arg0, arg1);

std::thread是MoveConstructible和MoveAssignable类型。这意味着像std::thread zombie(some_functor); std::thread steal(std::move(zombie)); zombie这样的代码将保留在一个特殊但有效的状态中,该状态与没有执行的线程相关联。默认构造函数在某种意义上是免费的,因为它所要做的就是将对象置于该确切状态。它还允许std::thread数组和std::vector<std::thread>::resize等操作。

答案 1 :(得分:18)

这意味着同样的事情:

 std::vector<int> emptyList;

emptyList为空。就像默认构造的std::thread一样。就像默认构造的std::ofstream不会打开文件一样。有完全合理的理由让默认构造自己的类成为空状态。


如果您有空线程:

std::thread myThread;

你可以通过这样做来实际启动线程:

myThread = std::thread(f, ...);

f是一些可调用的东西(函数指针,仿函数,std::function等),而...是要转发给线程的参数。

答案 2 :(得分:8)

不只是猜测:

“线程对象”是指std::thread

“执行线程”是指OS's collection of hardware registers that represent a thread

C ++ 11除了通过操作系统的API访问操作系统线程以便使C ++线程可以在所有操作系统中移植之外什么都不做。

  

<强>螺纹();
  效果:构造一个不代表执行线程的线程对象   后置条件: get_id()== id()
  投掷:没什么。

这意味着默认构造的std::thread不会引用操作系统生成的执行线程。

可以为std::thread赋予一个新值,从而开始通过移动赋值语句引用OS执行线程:

std::thread t;  // Does not refer to an OS thread
//...
t = std::thread(my_func);  // t refers to the OS thread executing my_func

答案 3 :(得分:3)

只是猜测,但它只是意味着线程没有启动。换句话说,它只是一个像任何其他对象一样的对象 - 它背后不一定有实际的OS线程。换句话说,如果线程是在pthreads之上实现的,那么创建一个C ++ 11线程对象并不一定会调用pthread_create() - 只需要在线程启动时发生。