c++11线程问题组,初学求解答

线程是否可以重用?
线程只能在构造是指定方法吗?
线程运行结束后是什么状态?
线程在windows上构造和析构都要消耗比较大的资源吗?
等待的锁的线程是在哪里?占用cpu吗?
初学并行编程,许多疑惑,越靠前的越要紧。
(写了一个程序在4核上没并行比并行效率高几倍,
并行的方法运算量不算小。编程环境visual studio2012)

不知道你说的线程重用是什么意思。线程的代码还是数据?同一个函数完全可以启动出很多线程,每个线程有自己的寄存器和堆栈上下文。好比你的电脑上只有一个word,但是完全可以多开。

线程只能在构造是指定方法吗,当然不是,在线程启动前都可以指定。

线程运行结束后是什么状态,就是stop状态了。

线程在windows上构造和析构都要消耗比较大的资源吗?看怎么理解这个大,一般也就是百把时钟周期吧,比进程创建少多了。几百时钟周期对于如果你一个线程只执行几个指令的极端变态情况来说是很大的。

但是实际不可能这样,如果你的线程需要cpu执行1秒,那么创建的开销就相当于百万分之一,多么微不足道(假设你的cpu是ghz级别时钟)

等待的锁的线程是在哪里?占用cpu吗?锁对于x86来说是硬件实现的,不需要占用cpu

写了一个程序在4核上没并行比并行效率高几倍
这个要看你并行代码在总程序中的占比,一个是你程序准备数据和汇总数据以及别的地方未必是并行的,一个是如果你使用了不当的加锁,那么这些代码也不是并行的。

最后,不知道你的cpu是否真的是4核。Intel笔记本的cpu很多是双核超线程的,在任务管理器中看到4个框不假,但是其实是双核。双核+超线程处理器一般大约只有2~2.5x的加速比,这还是假设你的程序全部都是并行的理想情况。
用cpu-z可以看下你的处理器的具体型号,以及拥有几个物理核心。

task放入一个任务队列,线程池从队列中抽取任务,干活,如果队列里没有任务,线程池线程等待。