私のクラスのメソッドでスレッドを初めて使用しようとしています。C++スレッドエラー:タイプが指定されていないタイプ
これは私のコードを単純化したもので、同じエラーが発生します。
#include <thread>
#include <iostream>
#include <memory>
#include <vector>
class Foo{
public:
std::vector<int> DoThing() {
return {1};
}
std::vector<int> DoThingMultiThread(unsigned int threads) {
std::vector<int> values;
std::vector<std::thread> threadVec(threads);
for (unsigned int i = 0; i < threads; ++i)
{
threadVec.at(i) = std::thread(&Foo::DoPartialThing, this, i, i, std::ref(values));
}
return values;
}
private:
void DoPartialThing(unsigned int value, unsigned int position, std::vector<unsigned int> &container) {
container.at(position) = value;
}
};
実際のコードでは、各スレッドがベクターのより大きな塊を埋めるようにしたいと思います。
cmake_minimum_required(VERSION 3.6)
project(ThreadTest)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS -pthread)
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
set(SOURCE_FILES main.cpp foo.hpp foo.cpp)
add_executable(ThreadTest ${SOURCE_FILES})
私はフラグ-pthreadは、コンパイルには無関係である含めるかどうか、それは常に提供します:
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mjgalindo/ClionProjects/ThreadTest/cmake-build-debug
[ 33%] Building CXX object CMakeFiles/ThreadTest.dir/main.cpp.o
[ 66%] Building CXX object CMakeFiles/ThreadTest.dir/foo.cpp.o
In file included from /usr/include/c++/6/thread:39:0,
from /home/mjgalindo/ClionProjects/ThreadTest/foo.cpp:3:
/usr/include/c++/6/functional: In instantiation of ‘struct std::_Bind_simple<std::_Mem_fn<void (Foo::*)(unsigned int, unsigned int, std::vector<unsigned int>&)>(Foo*, unsigned int, unsigned int, std::reference_wrapper<std::vector<int> >)>’:
/usr/include/c++/6/thread:137:26: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (Foo::*)(unsigned int, unsigned int, std::vector<unsigned int>&); _Args = {Foo*, unsigned int&, unsigned int&, std::reference_wrapper<std::vector<int, std::allocator<int> > >}]’
/home/mjgalindo/ClionProjects/ThreadTest/foo.cpp:15:89: required from here
/usr/include/c++/6/functional:1374:61: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (Foo::*)(unsigned int, unsigned int, std::vector<unsigned int>&)>(Foo*, unsigned int, unsigned int, std::reference_wrapper<std::vector<int> >)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^~~~~~~~~~~
/usr/include/c++/6/functional:1395:9: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (Foo::*)(unsigned int, unsigned int, std::vector<unsigned int>&)>(Foo*, unsigned int, unsigned int, std::reference_wrapper<std::vector<int> >)>’
_M_invoke(_Index_tuple<_Indices...>)
^~~~~~~~~
CMakeFiles/ThreadTest.dir/build.make:86: recipe for target 'CMakeFiles/ThreadTest.dir/foo.cpp.o' failed
make[3]: *** [CMakeFiles/ThreadTest.dir/foo.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/ThreadTest.dir/all' failed
make[2]: *** [CMakeFiles/ThreadTest.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/ThreadTest.dir/rule' failed
make[1]: *** [CMakeFiles/ThreadTest.dir/rule] Error 2
Makefile:118: recipe for target 'ThreadTest' failed
make: *** [ThreadTest] Error 2
私はCMakeLists.txtファイルとClionプロジェクトでこのコードを持っています私はこのような多くの質問を見てきましたが、それらのすべてがスレッドコンストラクタでthisパラメータを使用しなかったか、またはrefを使用しませんでした。私の推測は、私は間違ったpthreadをリンクしているが、そのちょうどの推測です。
プログラミング:コードはサイズが 'threads'のベクトルを作成し、0から始まり、インデックスが' threads'のときに終了する 'for'ループを実行します。ちょうど' at() 'インデックスが境界内にあることを確認します。 –
@PeteBeckerでは、()で言うのはこの場合重複しているということですか?私は()がより安全であることがわかるまで、私はいつも[]を使いました。 – mjgalindo
はい、 'at()'は冗長です。他にはない重要なことを追加するのは、単に「安全」なのです。正しく書かれたループがベクトルにインデックスを付け、インデックスが有効かどうかを確認しても、すでにそこにあるものには何も追加されません。ループを正しく記述すると、追加のチェックはほとんど必要ありません。 –