我正在尝试编写一个使用线程的简单C ++应用程序,只需要管理线程之间的几个共享变量。为了简单地做到这一点,我决定只做这些变量std::atomic
,这样我就不必担心手动锁定和解锁内容。
我尝试从一个简单的示例开始,在main中创建一个atomic
变量并将其传递给线程。当我尝试对其进行编译时,我感到很惊讶,并且遇到了一堆与模板几乎无关的可编译错误。
通过引用传递原子:
#include <atomic>
#include <thread>
// Causes an ugly compiler error
void func(std::atomic<int>& i) {
// Do something that uses "i" in the thread
}
int main() {
std::atomic<int> i;
std::thread t(func, i);
// Do something that uses "i" in main
t.join();
}
但是,如果我只是简单地通过指针传递原子变量,它将起作用。
通过指针传递原子:
#include <atomic>
#include <thread>
// Compiles fine
void func(std::atomic<int>* i) {
// Do something that uses "i" in the thread
}
int main() {
std::atomic<int> i;
std::thread t(func, &i);
// Do something that uses "i" in main
t.join();
}
这里到底发生了什么?该错误(在此处发布的时间太长,但是您可以对其进行编译,然后看到)似乎说明了std::atomic
没有复制构造函数的某些问题……但是我通过引用传递了它。为什么通过引用传递时,它会试图复制副本?