有很多替代方法来处理向量的元素.
我可以像这样使用指针:
vector<int> v = {10, 11, 12};
int *p = &v[0];
cout << *p; //Outputs "10"
Run Code Online (Sandbox Code Playgroud)
我也可以这样使用指针:
vector<int> v = {10, 11, 12};
vector<int>::pointer p = v.data();
cout << *p; //Outputs "10"
Run Code Online (Sandbox Code Playgroud)
我也可以使用迭代器类型:
vector<int> v = {10, 11, 12};
vector<int>::iterator i = v.begin();
cout << *i; //Outputs "10"
Run Code Online (Sandbox Code Playgroud)
我在这里缺少哪些重大差异?
我目前正在阅读Joe Albahari 在C#电子书中的线程,有时在他的示例代码中,他在我看不到任何线程安全问题的地方使用锁.例如,在这里,他锁定了对_status字段的写入和读取,该字段引用了一个不可变对象.
我理解如果ProgressStatus类是可变的,你需要锁定读取和写入它,因为如果一个线程被另一个读取状态的线程更新PercentComplete和StatusMessage字段之间的预占,第二个线程可能获取这些字段的无效值对.(100%完成/"正在进行中......")
但由于ProgressStatus是不可变的,因此不会出现这种无效状态.如果Joe删除了这两个锁,可能会出现什么线程安全问题?