synchronized en Java puede garantizar la seguridad de hilo.
¿Qué acerca de C++?

Gracias!

  • C++ no dice nada acerca de los hilos. Tendrá que confiar en el soporte de la biblioteca.
  • Debido a que C++11, sí!
  • sí, has visto la fecha del post?
  • Sí, vi a Mar 25 11 😛
InformationsquelleAutor Don Lun | 2011-03-25

4 Comentarios

  1. 44

    Utilice 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 sin embargo.

  2. 9

    A pesar de que esta pregunta ya ha sido respondida, por la idea de este artículo he hecho mi versión de synchronized palabra clave utilizando sólo de la biblioteca estándar de C++11) objetos:

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

    Puede probar como:

    #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 palabra clave de Java, pero funciona. Sin ella, el sayHello método del ejemplo anterior puede ser implementado como el aceptado respuesta 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;
    }
    • Esto sería genial si se implementa como una plantilla, pero me he encontrado con unos cuantos conocidos excepción (por ejemplo, assert), el código implementado con _#define_s es difícil de depurar.
  3. 5

    No hay ninguna palabra clave en C++03 equivalente a synchronized en Java . Pero usted puede utilizar la exclusión Mutua para garantizar la seguridad de hilo.

Dejar respuesta

Please enter your comment!
Please enter your name here