1

是否mutexpthread库中与 fromc++相同的synchronized关键字Java(无论我放在里面的调用函数是线程安全的)吗?我有城市列表

pthread_t thread1;

    class City{
    public:
    std::string name;
    int citizens;
    std::string state;
    std::string it_company;
    };

    pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
    std::list<City> cities;

    void* manage_cities(void*){
        pthread_mutex_lock(&lock);
        work_on_every_instance_of_list();//works on list cities
        pthread_mutex_unlock(&lock);
    }

    /*
    * This function is called periodically
    */
    void update_cities(){
        pthread_create( &thread1, NULL, &manage_cities, NULL);
        pthread_mutex_lock(&lock);
        for(std::list<City>::iterator iter=cities.begin();iter!=cities.end();++iter){
            std::cout<<(*iter).name<<"\n";
        }
        pthread_mutex_unlock(&lock);
    }

它在迭代中抛出异常,如Access location. 这是正确的做法还是我误解了互斥锁?

4

1 回答 1

5

是的,没有。

PThreads 互斥体与其资源之间的绑定比在 Java 中发现的要宽松得多。

使用 Java,synchronized根据语言定义保护特定事物,例如函数、数据项等。

如果您对正在访问的资源保持严格的控制,您当然可以在 PThreads 中做同样的事情,但是我可以想到一些不同之处。

首先,因为syncronized适用于定义对象的位置,所以无法绕过访问控制。Java 本身将保证使用该资源的人必须等到他们获得锁。

另一方面,如果您在没有首先获得锁的情况下对资源执行某些操作(互斥锁与其保护的资源之间存在“断开”,必须主动管理) ,那么PThreads 会非常高兴。很有可能会让你感到悲伤,但在访问资源之前是否获得锁,这在你的控制之下。

其次,这种断开提供了额外的灵活性:如果您想到 Java 中的一个数组需要保护,您倾向于锁定整个数组。PThreads 提供了一种更简单的方法(在我看来,无论如何)来保护部分资源。考虑一个包含 1000 个项目和 10 个互斥锁的数组,第一个互斥锁保护项目 0 到 99,第二个保护项目 100 到 199,依此类推。

这允许更好的并发性,因为两个线程可以同时对数组的不同部分执行某些操作而不会相互阻塞。我不确定您如何在 Java 中做到这一点,而不必将数组拆分为多个数组,这会引入其他问题。

第三,由于资源和互斥体之间存在这种脱节,PThreads 能够使用单个互斥体来保护各种不同的资源,同时synchronized与某种 Java“项”相关联。我自己不相信这是一件好事,但这是不同的。

现在,不要误会我的意思,这听起来像是 PThreads 的广告,syncronized但事实并非如此。您为增加灵活性而付出的代价是您以某种方式将事情塞满的可能性增加了。与大多数事情一样,这是一种权衡。

我碰巧喜欢 Java 的同步功能,因为它非常易于使用。

于 2013-04-26T01:51:47.987 回答