【发布时间】:2016-05-07 18:29:40
【问题描述】:
我有以下代码块,我期望的是 lambda 捕获列表中的 i 是按值传递的,而输出的 i 应该不同。
但是,实际结果是输出20行19 is completed。
我尝试将这一行 std::thread t([&func](){ 更改为 std::thread t([func](){,输出可能会打印不同的 i 值。
我的问题是为什么std::thread t([&func](){和std::thread t([func](){会导致i的输出值不同?
void DoSomething(std::function<void()> func)
{
std::thread t([&func](){
//do something
sleep(1);
if (func)
func();
});
t.detach();
}
int main(int argc, const char * argv[]) {
std::mutex mtx;
for (int i = 1 ; i < 20; i ++) {
DoSomething([i, &mtx](){
std::unique_lock<std::mutex> lock(mtx);
std::cout << i << " is completed" << std::endl;;
});
}
sleep(10);
}
【问题讨论】: