Visual Sudio 2012 では std::mutex コピー コンストラクターが非公開になっていることがわかったので、参照またはポインターでのみ渡すことができると思います。両方をテストしましたが、驚いたことに、参照スタイルは拒否されましたが、ポインター スタイルは成功しました。コンパイラによって、「エラー C2248: 'std::mutex::mutex' : クラス 'std::mutex' で宣言されたプライベート メンバーにアクセスできません」と表示されるため、コンパイラは std:: をコピーしようとしていると想定します。ミューテックスですが、実際には参照で渡します! 誰でもそれについて経験がありますか?ここにコードをリストします:
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
struct SharedMemory
{
public:
int s;
std::mutex mutex;
public:
SharedMemory( int s = 1 ) : s(s){}
void write( int s )
{
mutex.lock();
this->s = s;
mutex.unlock();
}
int read()
{
int tmp;
mutex.lock();
tmp = this->s;
mutex.unlock();
return tmp;
}
void print()
{
std::cout << read() << std::endl;
}
};
void modify( SharedMemory& sm, int i ) // **must use the pointer to the shared memory**
{
//sm->write(i);
sm.write(i);
}
int main( int argc, char* argv[] )
{
SharedMemory sm;
SharedMemory& tmp = sm;
std::vector< std::thread > vec;
for( int i = 0; i < 10; ++i )
{
vec.push_back( std::thread( modify, sm, i ) );
sm.print();
}
for( auto& it : vec ) it.join();
return 0;
}