给定foo_t[n]
类型的数组和n线程,其中每个线程读取和修改数组的不同元素,是否需要显式同步数组的修改,或者我可以假设同时修改数组的成员是明确定义的行为?它有多大foo_t
是/它有什么路线?定义好的行为是修改数组中的一个元素,而另一个线程修改同一数组的另一个元素吗?
回答
我试图做的是明确的行为。
见ISO/IEC 9899:2011§5.1.2.4.27:
注意的是引进分配到将不被抽象机被修改潜在共享存储器位置13个 编译器变换通常排除按照这个标准,因为在抽象机器执行不会遇到数据竞争的情况下,这样的分配可能会由不同的线程覆盖另一个分配。这包括数据成员分配的实现,用于覆盖单独内存位置中的相邻成员。我们通常也会排除在原子问题可能会混淆的情况下原子加载的重新排序,因为这可能会违反“可见序列”规则。
请注意,此语言是C11引入的优化,导致错误like this非法。 Pre-C11编译器可能不遵守此规则。
我不知道如何严格编译器实际坚持这一点。是否有任何编译器在单线程程序中执行字大小的写入来更新字符串中的字符,但在多线程系统中更改为字节大小的写入? –
@MattMcNabb我真的不知道。 – fuz
该笔记基于C11的线程。所以POSIX的线程实现可能不会遵循相同的规则。 –
- 1. 修改一个字典数组,在每个元素中添加一个元素
- 2. 我可以修改我的字符数组中的一个元素,但我不能修改另一个
- 3. 如何检查数组中的一个元素是否与同一数组中的另一个元素匹配?
- 4. php - 用另一个数组的元素替换数组元素?
- 5. 修改数组中的最后一个元素
- 6. 如何添加一个数组的第一个元素到另一个数组的第一个元素
- 7. 在另一个数组元素中包含数组元素值?
- 8. 按列索引修改numpy数组的每一行中的一个元素
- 9. 一个元素上的CSS事件,更改另一个元素
- 10. 在另一个数组中的元素为真的数组中选择元素
- 11. 修改一个数组会改变我制造的另一个数组
- 12. 的iOS斯威夫特 - 修改一个数组修改另一个
- 13. 如何就地修改一维数组的每个元素?
- 14. 用另一个修改的实例编辑一个数组
- 15. PHP将数组元素添加到另一个数组中的每个元素
- 16. 如何检查一个数组的元素是否在另一个数组中?
- 17. 用另一个数组中的特定元素替换数组元素
- 18. 将一个数组中的每个元素与另一个数组的每个元素相乘的方式?
- 19. copy元素到另一个数组
- 20. 高效的方式,如果数组元素是元素的另一个数组
- 21. 从perl中删除另一个数组中的一个数组中的元素
- 22. 一个元素使另一个元素
- 23. Php从一个类中的另一个数组中引用的数组元素
- 24. 从相同数组的另一个元素中减去一个数组的元素
- 25. 在web.config中修改一个元素
- 26. 检查数组的元素在PHP的另一个数组中
- 27. 从另一个数组创建一个特定元素的数组?
- 28. 数组元素是否可以引用另一个数组的元素?
- 29. 检查一个数组中的每个元素是否包含在另一个数组的一组值中
- 30. 如何将一个数组中的元素添加到另一个数组中?
数组的两个不同元素是两个不同的对象,因此有两个不同的内存位置。对不同存储器位置的并行/非同步访问保证是安全的。 (C11)Pre-C11,我认为这不安全。在C11之前,C主要是线程不可知的。 – dyp
@dyp如果foo_t小于字的大小,并且机器只能进行字大小的内存访问,该怎么办?一个成员的修改是否可能也会写出相邻成员的一部分? – fuz
@FUZxxl:在这种情况下,foo_t可能会被填充为字的大小。 –