2011-03-25 11 views

Respuesta

32

Utiliza el siguiente en C++ 11:

mutex _mutex; 

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

Uso impulso si usted no tiene un compilador de C++ 11 todavía.

4

No hay palabra clave en C++ 03 equivalente a synchronized en Java. Pero puede usar Mutex para garantizar la seguridad del hilo.

2

A pesar de esta pregunta ha sido contestada ya, por la idea de this artículo hice mi versión de synchronized de palabras clave usando la biblioteca solo estándar (C++ 11) Objetos:

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

puede probarlo gustaría:

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

Esto es sólo una aproximación de synchonized de palabras clave de Java, pero funciona. Sin ella el método del ejemplo anterior sayHello puede implementarse como el accepted answer dice:

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; 
} 
Cuestiones relacionadas