c++ - c++ 中 pthread 库中的互斥体是否与 Java 中的同步关键字相同

标签 c++ c pthreads mutex

mutexpthread图书馆 c++同样喜欢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 .这是正确的做法还是我误解了互斥量?

最佳答案

是的,也不是。

PThreads 互斥锁与其资源之间的绑定(bind)远没有您在 Java 中看到的那么严格。

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

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

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

另一方面,如果您在首先获得锁的情况下对资源进行某些操作,PThreads 会非常高兴(在互斥锁和它保护的资源之间存在“断开连接”,必须积极管理)。这很可能会让您感到悲伤,但在访问资源之前是否获得锁定在您的控制之下。

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

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

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

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

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

关于c++ - c++ 中 pthread 库中的互斥体是否与 Java 中的同步关键字相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16227462/

相关文章:

c++ - 除了运算符优先级之外,额外的括号何时会产生影响?

清除换行符后的输入行

c - 无法理解以下程序中的 pthread_create() 行为?

c - 如果 bar() 和 foo() 互斥,如何在 foo() 中运行 bar()

c - pthreads的生产者消费者问题

c++ - Live555 在一个 RTSP 流中流式传输实时视频和音频

c++ - 使用>>链检查非整数输入(C++)

c++ - 关于销毁策略的 unique_ptr<> v shared_ptr<>

python - 任意 C 项目的预处理

c - 在 linux 内核模块中运行无限循环