mutex
中的pthread
库中的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
之类的迭代中抛出异常。这是正确的做法还是我误解了互斥锁?
答案 0 :(得分:5)
是的,没有。
PThreads互斥锁与其资源之间的绑定严格程度远远低于Java中的绑定。
使用Java,synchronized
根据语言定义保护特定内容,例如函数,数据项等。
如果你严格控制所访问的资源,你当然可以在PThreads中做同样的事情,但是我可以想到一些不同之处。
首先,因为syncronized
适用于定义对象的位置,所以无法绕过访问控制。 Java本身将保证使用该资源的人必须等到他们获得锁定。
其次,这种断开连接允许额外的灵活性:如果您认为Java中的数组需要保护,您倾向于锁定整个数组。 PThreads允许更简单的方式(在我看来,无论如何)来保护资源的部分。想象一下1000个项目和10个互斥锁的数组,第一个互斥锁保护项目0到99,第二个保护项目100到199,依此类推。
这允许更好的并发性,因为两个线程可以同时对数组的不同部分执行某些操作而不会相互阻塞。我不确定你是如何在Java中那样做的,而不必将数组拆分成多个数组,这会引入其他问题。
第三,由于资源与互斥锁之间存在这种脱节,因此PThreads能够使用单个互斥锁来保护各种不同的资源,而synchronized
则与某种Java“项目”相关联。我不相信自己是好的事情,但这是有区别的。
现在,不要误解我的意思,这可能听起来像syncronized
上的PThreads广告,但事实并非如此。您为增加灵活性而付出的代价是增加了以某种方式填充内容的可能性。与大多数事情一样,这是一种权衡。
我碰巧喜欢Java的同步内容,因为它很容易使用。