私はいくつかのグーグルを行い、この問題に関するスタックオーバーフローに関する同様の質問を見ましたが、それに対処するための原因/解決策を理解するのに苦労しています. ThreadPool.hpp で宣言されている次のクラスがあると、次の 2 つのエラーが発生します。
エラー 1 エラー C2248: 'std::mutex::mutex': クラス 'std::mutex' c:\users\jesse\documents\school\summer semester 2012\concurrent processing\project 2\ultra_grep で宣言されたプライベート メンバーにアクセスできませんv2\ultra_grep\threadpool.hpp 39 1 ultra_grep2
エラー 2 エラー C2248: 'std::condition_variable::condition_variable': クラス 'std::condition_variable' c:\users\jesse\documents\school\summer semester 2012\concurrent processing\project 2\ultra_grep で宣言されたプライベート メンバーにアクセスできませんv2\ultra_grep\threadpool.hpp 39 1 ultra_grep2
class ThreadPool
{
private:
std::queue<std::string> _consoleTasks;
std::queue<std::tr2::sys::path> _tasks;
std::map<std::string, std::vector<GrepMatch>> _grepMatches;
int _nThreads, _fileMatches, _totalMatches, _workingThreads;
std::vector<thread> _threads;
Arguments _args;
std::mutex _taskMutex, _wakeMutex, _consoleMutex, _threadCountMutex;
std::condition_variable _wakeCondition;
public:
ThreadPool( int threads, Arguments args );
~ThreadPool() {};
void GrepFunc();
void ConsoleFunc();
void SearchFile( std::string );
void SearchFileVerbose( std::string );
void DisplayGrepResults();
queue<std::tr2::sys::path> Tasks() { return _tasks; }
};
ThreadPool.cpp 内に実装されているコード:
#include "ThreadPool.hpp"
using namespace std;
namespace fs = std::tr2::sys;
ThreadPool::ThreadPool( int threads, Arguments args )
: _nThreads( threads ), _args( args ), _fileMatches( 0 ), _totalMatches( 0 ), _workingThreads( 0 )
{
for( int i = 0; i < _nThreads; ++i )
{
_threads.push_back( thread( &ThreadPool::GrepFunc, this ) );
_tasks.push( args.root() );
++_workingThreads;
_wakeCondition.notify_one();
}
for( auto& t : _threads )
{
t.join();
}
DisplayGrepResults();
}
void ThreadPool::GrepFunc()
{
// implement a barrier()
while( !_workingThreads )
{
{ unique_lock<mutex> lk( _wakeMutex );
_wakeCondition.wait( lk ); }
while( !_tasks.empty() )
{
fs::path task;
bool gotTask = false;
{
lock_guard<mutex> tl( _taskMutex );
if( !_tasks.empty() )
{
{ lock_guard<mutex> tc( _threadCountMutex );
++_workingThreads; }
task = _tasks.front();
_tasks.pop();
gotTask = true;
}
}
if( gotTask )
{
if( fs::is_directory( task ) )
{
for( fs::directory_iterator dirIter( task ), endIter; dirIter != endIter; ++dirIter )
{
if( fs::is_directory( dirIter->path() ) )
{
{ lock_guard<mutex> tl( _taskMutex );
_tasks.push( dirIter->path() ); }
_wakeCondition.notify_one();
}
else
{
for( auto& e : _args.extensions() )
{
if( !dirIter->path().extension().compare( e ) )
{
{ lock_guard<mutex> tl( _taskMutex );
_tasks.push( dirIter->path() ); }
_wakeCondition.notify_one();
//SearchFile( dirIter->path() );
}
}
}
}
}
else
{
for( auto& e : _args.extensions() )
{
if( !task.extension().compare( e ) )
{
if( _args.is_verbose() )
SearchFile( task );
else
SearchFileVerbose( task );
}
}
}
{ lock_guard<mutex> tc( _threadCountMutex) ;
--_workingThreads; }
}
}
}
}
void ThreadPool::SearchFileVerbose( string path )
{
fstream file;
file.open( path );
if( !file )
{
// error handling
}
else
{
{
lock_guard<mutex> cm( _consoleMutex );
cout << "\nGrepping: " << path << endl;
int lineNumber = 1;
string line;
vector<GrepMatch> matches;
while( getline( file, line ) )
{
int lineMatches = 0;
sregex_token_iterator end;
for (sregex_token_iterator i(line.cbegin(), line.cend(), _args.regular_expression() );
i != end;
++i)
{
++lineMatches;
}
if( lineMatches > 0 )
{
GrepMatch match = GrepMatch( lineNumber, lineMatches, line );
matches.push_back( match );
cout << "Matched " << lineMatches << ": " << path << " [" << lineNumber << "] " << line << endl;
}
++lineNumber;
}
if( !matches.empty() )
{
_grepMatches[ path ] = matches;
}
}
}
}
ミューテックスと condition_variable の両方で、クラス内で宣言されたプライベート メンバーにアクセスできないというエラーが表示されます。これはコピーコンストラクターを指していると理解していますか? なぜそれが機能するのかわかりませんが、クラスのプライベートメンバーであるため、コピーを作成しようとしている場所がわかりません。
最初のコメントによると、ThreadPool のインスタンスを 1 つだけインスタンス化し、どこにもコピーしません。ミューテックスに触れようとしているのは、クラスの .cpp 実装だけです。
なぜこれが起こっているのかをよりよく理解するのを手伝ってくれる人はいますか?
興味のある方は、コンパイラの出力を以下に示します。
1>------ Build started: Project: ultra_grep2, Configuration: Debug Win32 ------
1> ultra_grep_main.cpp
1> Unknown compiler version - please run the configure tests and report the results
1>c:\users\jesse\documents\school\summer semester 2012\concurrent processing\project 2\ultra_grep v2\ultra_grep\threadpool.hpp(39): error C2248: 'std::mutex::mutex' : cannot access private member declared in class 'std::mutex'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\mutex(116) : see declaration of 'std::mutex::mutex'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\mutex(107) : see declaration of 'std::mutex'
1> This diagnostic occurred in the compiler generated function 'ThreadPool::ThreadPool(const ThreadPool &)'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\mutex(116) : see declaration of 'std::mutex::mutex'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\mutex(107) : see declaration of 'std::mutex'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\mutex(116) : see declaration of 'std::mutex::mutex'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\mutex(107) : see declaration of 'std::mutex'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\mutex(116) : see declaration of 'std::mutex::mutex'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\mutex(107) : see declaration of 'std::mutex'
1>c:\users\jesse\documents\school\summer semester 2012\concurrent processing\project 2\ultra_grep v2\ultra_grep\threadpool.hpp(39): error C2248: 'std::condition_variable::condition_variable' : cannot access private member declared in class 'std::condition_variable'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\condition_variable(45) : see declaration of 'std::condition_variable::condition_variable'
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\condition_variable(30) : see declaration of 'std::condition_variable'
1> This diagnostic occurred in the compiler generated function 'ThreadPool::ThreadPool(const ThreadPool &)'
1> ThreadPool.cpp
1> Generating Code...
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========