我发现 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;
}