具有共享对象的 C++11 多线程

标签 c++ multithreading c++11

<分区>

在 C++11 中,我想创建类 FooAlpha 的对象(fooalpha,分别)。然后我想创建一个调用 alpha 函数的线程,将 foo 作为参数传递。在该线程运行的同时,我希望能够修改 foo

到目前为止,这是我的代码:

#include <thread>
#include <iostream>

class Foo
{
public:
    int x;
    void Bar()
    {
        std::cout << x << std::endl;
    }
};

class Alpha
{
public:
    void Beta(Foo& foo)
    {
        while (true)
        {
            foo.Bar();
        }
    }
};

int main()
{
    Foo foo;
    foo.x = 5;
    Alpha alpha;
    std::thread beta_thread(&Alpha::Beta, alpha, foo);
    beta_thread.join();

    while (true)
    {
        foo.x++;
    }

    return 0;
}

但是,这给了我一个编译错误:

/usr/include/c++/4.8/functional:1697: error: no type named 'type' in 'class std::result_of<std::_Mem_fn<void (Alpha::*)(Foo&)>(Alpha, Foo)>'
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^

如果我按值而不是引用传递 foo (void Beta(Foo foo)),那么它编译正常。但是,我相信我需要通过引用传递,这样当我在主循环中修改 foo 时,它会更改我传递给 Beta 的同一个实例。

有什么帮助吗?

最佳答案

当您将对象传递给thread 构造函数时,它们是按值获取的。如果你想通过引用传递一些东西,你必须说 std::ref(foo)

默认是按值获取参数而不是完美转发的原因是因为线程的生命周期通常不受范围限制,并且设计者不想让它变得如此容易意外创建将本地对象用作参数时的悬挂引用。

关于具有共享对象的 C++11 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29755244/

相关文章:

c++ - 为什么 operator char*() 在 bool 上下文中覆盖 operator bool() const?

c++ - 关于 C++ 中基于范围的 for 循环的困惑

c++ - 当我终止进程时,它也会终止线程吗?

java - 多线程Java服务器: allowing one thread to access another one

c++ - 我们可以对 std::array 使用传统的指针算法吗?

构造函数上的 C++ vector 释放

c++ - Arduino 是否完全支持 C++ 标准库?

c - 通过线程进行多次访问导致数据丢失的搜索示例(C 语言)

c++ - 如何使默认析构函数成为非内联的?

c++ - 字节顺序标记真的是一个有效的标识符吗?