Что такое функция Correspoding для синхронизации в Java? - PullRequest
43 голосов
/ 25 марта 2011

synchronized в Java может гарантировать безопасность резьбы.А как насчет C++?

Спасибо!

Ответы [ 5 ]

42 голосов
/ 25 марта 2011

Используйте следующее в C ++ 11:

mutex _mutex;

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

Используйте boost, если у вас еще нет компилятора C ++ 11.

8 голосов
/ 10 мая 2017

Несмотря на то, что на этот вопрос уже был дан ответ, по идее этой статьи я сделал свою версию ключевого слова synchronized, используя только стандартные объекты библиотеки (C ++ 11):

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

Вы можете проверить это как:

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

Это лишь приблизительное значение ключевого слова synchonized Java, но оно работает. Без этого метод sayHello из предыдущего примера может быть реализован как принятый ответ говорит:

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;
}
5 голосов
/ 25 марта 2011

В C ++ 03 нет ключевого слова, эквивалентного synchronized в Java. Но вы можете использовать Mutex, чтобы гарантировать безопасность нити.

2 голосов
/ 20 ноября 2012

Вы также можете посмотреть на: «Синхронизированный» оператор для C ++, как в Java С этим методом вы можете использовать синхронизированный как в Java.

2 голосов
/ 25 марта 2011

C ++ не имеет встроенных потоков или синхронизации (пока), для этого нужно использовать библиотеки.Boost.Thread - хорошая переносимая библиотека, совместимая с предлагаемыми средствами потоков в C ++ 0x .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...