1

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

0 回答 0