synchronized
in Java
peut garantir la sécurité du thread. Qu'en est-il de C++
?
Je vous remercie!
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.
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;
}
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.
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 .