sirve - ¿Qué es la función de correspoding para sincronizados en Java?
synchronized java example (5)
synchronized
en Java
puede garantizar la seguridad del hilo. ¿Qué hay de C++
?
¡Gracias!
A pesar de que esta pregunta ya ha sido respondida, con la idea de this artículo hice mi versión de palabra clave synchronized
utilizando solo objetos de biblioteca estándar (C ++ 11):
#include <mutex>
#define synchronized(m) /
for(std::unique_lock<std::recursive_mutex> lk(m); lk; lk.unlock())
Puedes probarlo así:
#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;
}
Esta es solo una aproximación de la palabra clave synchonized
de Java, pero funciona. Sin él, el método sayHello
del ejemplo anterior puede implementarse como dice la respuesta aceptada :
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;
}
C ++ no tiene subprocesamiento o sincronización integrados (todavía), debe usar librerías para eso. Boost.Thread
es una buena biblioteca portátil que está diseñada para ser compatible con las instalaciones de subprocesamiento propuestas en C ++ 0x .
No hay palabra clave en C ++ 03 equivalente a synchronized
en Java. Pero puede usar Mutex para garantizar la seguridad del hilo.
También puede echar un vistazo a: una declaración "sincronizada" para C ++ como en Java. Con este método puede usar sincronización como en Java.
Use lo siguiente en C ++ 11:
mutex _mutex;
void f()
{
unique_lock<mutex> lock(_mutex);
// access your resource here.
}
Use boost si todavía no tiene un compilador de C ++ 11.