为什么不能通过引用将std :: atomic变量传递给线程? (但您可以通过指针)

时间:2019-07-11 16:49:05

标签: c++ multithreading c++11 pass-by-reference atomic

我正在尝试编写一个使用线程的简单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没有复制构造函数的某些问题……但是我通过引用传递了它。为什么通过引用传递时,它会试图复制副本?

0 个答案:

没有答案