web-dev-qa-db-fra.com

qu'est-ce que la fonction de correspodage pour synchronisé en java?

synchronized in Java peut garantir la sécurité du thread. Qu'en est-il de C++?

Je vous remercie!

43
Don Lun

Utilisez ce qui suit en C++ 11:

mutex _mutex;

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

Utilisez boost si vous n'avez pas encore de compilateur C++ 11.

44
ybungalobill

Malgré cette question à laquelle on a déjà répondu, par l'idée de this article, j'ai créé ma version du mot clé synchronized en utilisant uniquement des objets de bibliothèque standard (C++ 11):

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

Vous pouvez le tester comme:

#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;
}

Ceci n'est qu'une approximation du mot clé synchonized de Java mais cela fonctionne. Sans lui, la méthode sayHello de l'exemple précédent peut être implémentée comme réponse acceptée dit:

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

Il n'y a pas de mot clé en C++ 03 équivalent à synchronized dans Java. Mais vous pouvez utiliser Mutex pour garantir la sécurité du thread.

5
Nawaz

C++ n'a pas encore de threading ou de synchronisation intégré, vous devez utiliser des bibliothèques pour cela. Boost.Thread est une bonne bibliothèque portable conçue pour être compatible avec les fonctionnalités de threading proposées en C++ 0x .

2
Björn Pollex