尽管已经回答了这个问题,但根据本文的想法,我仅使用标准库(C ++ 11)对象制作了synchonized关键字版本:
#include
#define synchronized(m) \
for(std::unique_lock<:recursive_mutex> lk(m); lk; lk.unlock())
您可以像这样测试它:
#include
#include
#include
#include
#include
#define synchronized(m) \
for(std::unique_lock<: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<: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;
}
这只是Java关键字synchonized的近似值,但它可以工作。 没有它,可以将先前示例的sayHello方法实现为已接受的答案:
void sayHello(unsigned int n) {
std::unique_lock<:recursive_mutex> lk(m_mutex);
std::cout << "Hello! My number is: ";
std::cout << std::setw(2) << n << std::endl;
}