std :: move给出了将std :: string移动到另一个线程的错误

时间:2017-01-05 11:42:29

标签: c++ multithreading qt c++11

在下面的代码中,std::move提供了2个这样的错误,并将我带到了一个名为functional的文件中:

    1. /usr/include/c++/4.9/functional:1665: error: no type named 'type' in 'class std::result_of<Fctor(std::basic_string<char>)>'
   typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                         ^

    2. /usr/include/c++/4.9/functional:1695: error: no type named 'type' in 'class std::result_of<Fctor(std::basic_string<char>)>'
     _M_invoke(_Index_tuple<_Indices...>)
     ^

现在,将std::move替换为std::ref可以正常工作。我正在使用C ++ 11支持的QT Creator进行编码。我正在从here学习C ++多线程,这个代码在该视频上工作正常。

    #include <utility>
    #include <iostream>
    #include <thread>
    #include <string>

    using namespace std;

    class Fctor
    {
    public:
        void operator()(std::string& msg)
        {
            cout << "t1 says: " << msg << endl;
            msg = "Trust is the mother of deceit.";
            std::cout << std::this_thread::get_id() << endl;
        }
    };

    int main()
    {
        string str = "Where there is no trust there is no love.";
        std::cout << std::this_thread::get_id() << endl;

        Fctor fct;
        std::thread t1( fct, std::move(str)); // DOES NOT WORK
        //std::thread t1( fct, std::ref(str) );
        std::cout << t1.get_id() << endl;

        std::thread t2=std::move(t1);

        t2.join();
        cout << "from main: " << str << endl;

        return 0;
    }

1 个答案:

答案 0 :(得分:3)

问题是你的仿函数(std::string& msg),你的函数得到一个l值引用,你将它作为r值引用传递。

这就是为什么使用std::ref成功,而std::move失败,但是如果你想从主线程中读取它,为什么要尝试将字符串移动到线程构造函数中呢?

此外,您的代码呈现未定义的行为;从主线程中读取str时从t1写入 $ ./node_modules/.bin/ng-xi18n Error: Unexpected value 'Select2Component' declared by the module 'AppModule' 。这引入了具有未定义行为的数据争用条件。

我认为你需要决定字符串操作的确切行为。并且不要忘记将数据与锁同步。