java中同步的相应功能是什么?

时间:2011-03-25 07:25:12

标签: java c++ multithreading synchronization

synchronized中的

Java可以保证线程的安全性。 那么C++呢?

谢谢!

5 个答案:

答案 0 :(得分:42)

在C ++ 11中使用以下内容:

mutex _mutex;

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

如果您还没有C ++ 11编译器,请使用boost。

答案 1 :(得分:8)

尽管已经回答了这个问题,但是this文章的想法是我使用标准库(C ++ 11)对象创建了synchronized关键字的版本:

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

这只是Java的synchonized关键字的近似值,但它有效。如果没有它,前一个示例的sayHello方法可以实现为accepted answer说:

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

答案 2 :(得分:5)

在Java中,C ++ 03中没有与synchronized等效的关键字。但您可以使用Mutex来保证线程的安全性。

答案 3 :(得分:2)

C ++没有内置的线程或同步(还),你必须使用库。 Boost.Thread是一个很好的便携式库,旨在与proposed threading facilities in C++0x兼容。

答案 4 :(得分:2)

您还可以查看: A "synchronized" statement for C++ like in Java 使用此方法,您可以在Java中使用synchronized。