【问题标题】:C++ multithreaded pointer to pointer to pointerC++多线程指针指向指针
【发布时间】:2014-02-03 18:22:03
【问题描述】:

假设我有一个指向指针的指针,即 int*** ptr,它包含一个三维数组。根据 CPU,我希望有大约三个线程同时写入和读取我的指针。为简单起见,不会对 ptr 进行重新调整(如果必须重新调整指针的大小,我仍然想知道如何处理多线程)。我想同时写入指针而不必使用互斥锁,因为它会阻塞其他线程。我该怎么做?原子模板类我还是不太懂……

谢谢! :)

【问题讨论】:

  • 互斥锁是您处理并发的方式...如果您要更改指针指向的位置,您不希望其他线程查看错误的位置。 ..
  • 其实我并没有改变指针本身;我正在更改指针指向的值。例如:ptr[0][0][0] = something.
  • @user2924010 如果你真的没有调整大小,即:你基本上有一个带有运行时值的myArray[x][y][z],那么你应该可以使用std::atomic<int>。这样,所有元素都可以“安全”地读取和写入。如果必须更改任何数组,那么您将需要同步(互斥体)。您可以考虑将其包装在一个类型中以处理此外部客户端代码。
  • @FrançoisMoisan "safe" 是正确的,但它可能会应用最终用户不需要的安全性,这会减慢代码并使其变得更加庞大。
  • @MadScienceDreams 正确,但他应该意识到这一点。他可能仍然会遇到问题,因为他同时在谈论阅读/写作。

标签: c++ multithreading pointers multidimensional-array


【解决方案1】:

这取决于你的线程是如何运行的。

所有线程都可以从给定位置读取而不会发生冲突,但是它正在更改一个值(同时更改值,在更改时读取值,或者使用已更改的读取值)这就是问题.

如果您保证线程之间不会更改任何值(例如,线程 1 写入 ptr[0][0][x]、线程 2 ptr[0][1][x]、线程 3 ptr[0][2][x]) 你实际上根本不需要做任何互斥锁。

如果您没有该保证,那么您必须对值的每次读取和写入进行互斥。

尺寸调整本质上是更改指针值。因此,如果只有 1 个线程必须处理正在更改的指针值,您不必担心。否则,每次读写互斥。因此,如果只有 1 个线程曾经访问过 ptr[0][0],并且您需要调整 ptr[0][0] 的大小,那么您就是黄金。

如果您没有该保证,那么您必须对值的每次读取和写入进行互斥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2011-04-24
    • 2019-09-10
    • 2010-09-08
    相关资源
    最近更新 更多