c++ - 是否有必要锁定一个*仅从一个线程写入*而*仅从*另一个线程读取的数组?

标签 c++ c arrays multithreading

我有两个线程正在运行。他们共享一个数组。其中一个线程将新元素添加到数组(并删除它们),另一个线程使用此数组(仅限读取操作)。 在添加/删除数组或从中读取之前,我是否有必要锁定数组?

更多细节:

  • 我需要在另一个线程中继续迭代整个数组。如前所述,那里没有写操作。 “只是扫描固定大小的循环缓冲区之类的东西”
  • 在这种情况下,最简单的做法是使用锁。然而,锁可能非常慢。如果可以避免使用锁,我不想使用锁。此外,正如从讨论中得出的那样,可能没有必要(实际上不是)锁定数组上的所有操作。只需锁定数组迭代器的管理(其他线程将使用的计数变量)就足够了

我不认为这个问题“太宽泛”。如果仍然如此,请告诉我。我知道这个问题并不完美。我必须结合至少 3 个答案才能解决问题 - 这表明大多数人无法完全理解所有问题,并被迫做一些猜测工作。但其中大部分来 self 试图纳入问题的评论。这些答案帮助我非常客观地解决了我的问题,我认为这里提供的答案对于开始使用多线程的人来说是非常有用的资源。

最佳答案

如果两个线程在同一个内存位置执行操作,并且至少有一个操作是写操作,那么您就有了所谓的数据竞争。根据 C11 和 C++11,具有数据竞争的程序的行为是未定义的。

所以,你必须使用某种同步机制,例如:

关于c++ - 是否有必要锁定一个*仅从一个线程写入*而*仅从*另一个线程读取的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24682518/

相关文章:

c - 如何在客户端连接时将其两个两个连接

c中计算字符串中不同符号的个数

C++ 二维数组空白输出

c++ - FindResource 1813 错误 RC_DATA

c - 如何在C中将数组插入数组

php - 如何在 MySQL 表中存储数组值?

javascript - 返回对象数组

java - 如何动态设置数组长度

c++ - 在 MFC 的 Tree(CTreeCtrl) 中为特定树项添加图标

c++ - iOS:在方法内编辑对象