web-dev-qa-db-ja.com

Javaでの同期に対応する機能は何ですか?

synchronizedJavaは、スレッドの安全性を保証できます。 C++

ありがとうございました!

43
Don Lun

C++ 11では以下を使用します。

mutex _mutex;

void f()
{
     unique_lock<mutex> lock(_mutex);
     // access your resource here.
}

C++ 11コンパイラがまだない場合は、boostを使用します。

44
ybungalobill

この質問はすでに回答されていますが、 this 記事のアイデアにより、標準ライブラリ(Cのみを使用してsynchronizedキーワードのバージョンを作成しました++ 11)オブジェクト:

#include <mutex>
#define synchronized(m) \
    for(std::unique_lock<std::recursive_mutex> lk(m); lk; lk.unlock())

次のようにテストできます:

#include <iostream>
#include <iomanip>
#include <mutex>
#include <thread>
#include <vector>

#define synchronized(m) \
    for(std::unique_lock<std::recursive_mutex> lk(m); lk; lk.unlock())

class Test {
    std::recursive_mutex m_mutex;
public:
    void sayHello(int n) {
        synchronized(m_mutex) {
            std::cout << "Hello! My number is: ";
            std::cout << std::setw(2) << n << std::endl;
        }
    }    
};

int main() {
    Test test;
    std::vector<std::thread> threads;
    std::cout << "Test started..." << std::endl;

    for(int i = 0; i < 10; ++i)
        threads.Push_back(std::thread([i, &test]() {
            for(int j = 0; j < 10; ++j) {
                test.sayHello((i * 10) + j);
                std::this_thread::sleep_for(std::chrono::milliseconds(100));
            }
        }));    
    for(auto& t : threads) t.join(); 

    std::cout << "Test finished!" << std::endl;
    return 0;
}

これは、Javaのsynchonizedキーワードの近似にすぎませんが、機能します。これがない場合、前の例のsayHelloメソッドは、 受け入れられた答え は言う:

void sayHello(unsigned int n) {
    std::unique_lock<std::recursive_mutex> lk(m_mutex);

    std::cout << "Hello! My number is: ";
    std::cout << std::setw(2) << n << std::endl;
}
9
Akira

C++ 03には、Javaのsynchronizedに相当するキーワードはありません。ただし、Mutexを使用してスレッドの安全性を保証することができます。

5
Nawaz

C++には(まだ)スレッドや同期が組み込まれていません。そのためにはライブラリを使用する必要があります。 Boost.ThreadC++ 0xで提案されているスレッド機能 と互換性があるように設計された優れたポータブルライブラリです。

2
Björn Pollex