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