【问题标题】:accessing and writing to array from different threads从不同的线程访问和写入数组
【发布时间】:2017-01-09 14:10:13
【问题描述】:

我有一个简单的字符串数组,我正在尝试通过不同的多个线程访问和写入它们。事实上,我已经固定了 char[10] 每个的大小,因为我的每个字符串的长度总是

当我从不同线程写入这些字符串时会出现问题,并且当我从不同线程更改arr[2] 的某些字符串时,结果是一种不可预测的,因为线程可能在彼此之前运行并且输出是不可预测并且经常混合这两个字符串。这是因为字符串由多个字符组成,不同的线程同时访问同一字符串的不同字符,从而产生混合字符串。

我研究了 mutexesatomic 变量。互斥锁需要锁定变量,然后写入字符串,然后解锁。这是解决问题的好方法吗?我试图理解原子方法,但它直接在我脑海中浮现:/

另一个问题是,如果数组是由真正的原子操作组成的,比如一个 bool 数组,我只需要为每个索引设置 true 或 false,那么这个问题也会出现吗?既然没有多个字符,问题应该不存在吧?

【问题讨论】:

  • 所有线程都需要写入同一个全局字符串吗?你能完成所有的处理,然后在最后返回一个字符串,然后将所有线程中的所有字符串结合起来吗?
  • 一切都与同步有关。如果至少有一个线程写入,您需要确保多个线程不会同时访问相同的数据。
  • 维基百科有一个很好的介绍:en.wikipedia.org/wiki/Readers%E2%80%93writers_problem
  • @hg_git 是的。标准规定 如果程序的执行包含不同线程中的两个冲突操作,则程序的执行包含数据竞争,其中至少一个不是原子的,并且两者都不会在另一个之前发生。任何此类数据竞争都会导致未定义的行为。 [注:可以证明程序正确使用了互斥锁和emory_order_-seq_cst操作
  • 这基本上归结为:当至少一个线程是写入器时,让多个线程访问同一个对象而不同步是未定义的行为

标签: c++ arrays string multithreading c++11


【解决方案1】:

我的个人建议是:为每个字符串设置一个互斥锁,线程在执行此操作之前为他们想要写入的字符串获取互斥锁。

与对所有字符串使用一个全局互斥锁相比,这允许并行访问不同的字符串,因此很有可能获得更好的性能。

但是请注意,如果您没有正确处理多个互斥锁,它们总是会带来死锁的风险。避免这种情况的一种方法是实现每个线程一次不持有多个互斥锁。然后您立即保存。

如果您在一个线程中需要多个互斥锁,那么避免死锁的一个简单策略是始终在每个线程中以相同的顺序获取互斥锁。

【讨论】:

  • 谢谢,您能否举一个简单的例子,说明多个互斥锁是如何成为问题的 - multiple mutexes always bring the risk of dead locks, if you do not handle them correctly。这里怎么会发生死锁。
  • @hg_git 想象一下两个线程,T1 和 T2,以及两个互斥锁 M1 和 M2。两个线程都想获取两个互斥锁。 T1 正在运行,设法锁定 M1,但被中断。 T2 运行,设法锁定 M2,但无法获得 M1,因为它已经被锁定。现在再次运行T1,因为T2已经锁定了M2,所以无法再获得M2。两个线程都不再运行...
  • @hg_git 这里的问题是互斥体的获取顺序不同。如果 T1 和 T2 都尝试先锁定 M1,则不会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多