synchronized
в Java
может гарантировать безопасность резьбы.
Что насчет C++
?
Спасибо!
synchronized
в Java
может гарантировать безопасность резьбы.
Что насчет C++
?
Спасибо!
Используйте в С++ 11 следующее:
mutex _mutex;
void f()
{
unique_lock<mutex> lock(_mutex);
// access your resource here.
}
Используйте boost, если у вас еще нет компилятора С++ 11.
Несмотря на то, что на этот вопрос уже был дан ответ, по идее этой статьи я создал свою версию ключевого слова synchronized
, используя только стандартные объекты библиотеки (С++ 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;
}
В С++ 03 нет ключевого слова, эквивалентного synchronized
в Java. Но вы можете использовать Mutex, чтобы гарантировать безопасность потока.
С++ не имеет встроенной потоковой передачи или синхронизации (пока), для этого вам нужно использовать библиотеки. Boost.Thread
- хорошая переносная библиотека, которая предназначена для совместимости с предлагаемые поточные устройства в С++ 0x.
Вы также можете посмотреть: "Синхронизированный" оператор для С++, как в Java С помощью этого метода вы можете использовать синхронизированный, как в Java.