【发布时间】:2014-01-22 17:00:50
【问题描述】:
#include <atomic>
#include <thread>
#include <iostream>
#include <vector>
std::atomic<int> i (0);
void add_one()
{
std::this_thread::sleep_for(std::chrono::seconds(1)); // [1]
++i; // [2]
}
int main()
{
std::vector<std::thread> threads;
while(i < 10)
{
threads.push_back(std::thread(&add_one));
} // [3]
std::cout << "num threads: " << threads.size() << std::endl;
for(auto& t : threads)
{
t.detach();
}
std::cout << "i: " << i << std::endl;
return 0;
}
这段代码有很多错误,我什至不知道如何开始。最初我只是想说服自己原子 int 真的是原子的。所以我开始构建一些代码来做到这一点。在 OSX 上运行时(使用 Clang 编译),当前代码将给出“system_error:线程构造函数失败:资源暂时不可用”。使用 Visual Studio 在 Windows 上没有错误。这是由 [1] 行引起的。如果我将 [1] 移到 [2] 之后,则不会出错。
但让我大吃一惊的是,这 [3] 应该是一个无限循环!我不知道线程在构造时会开始执行它被赋予的函数。我一直认为那是thread.join 或thread.detach。有没有办法构造一个线程对象并告诉它在我希望它启动之前不要做任何事情?
有鉴于此,线程构造函数在运行时发出警告,因为它等待的时间太长,这并不让我感到惊讶,但是当我将第 [1] 行移到 [2 之后,为什么它会消失]? 什么时候搬?
void add_one()
{
++i;
std::this_thread::sleep_for(std::chrono::seconds(5));
std::cout << "blah" << std::endl;
}
Blah 永远不会显示,即使是乱码、非线程安全的方式也是如此。就像它从未存在过一样。
在 windows 上会打印这些废话。
对于我所面临的巨大困惑,我深表歉意。
【问题讨论】:
标签: c++ multithreading c++11 clang