【发布时间】:2017-01-09 14:10:13
【问题描述】:
我有一个简单的字符串数组,我正在尝试通过不同的多个线程访问和写入它们。事实上,我已经固定了 char[10] 每个的大小,因为我的每个字符串的长度总是
当我从不同线程写入这些字符串时会出现问题,并且当我从不同线程更改arr[2] 的某些字符串时,结果是一种不可预测的,因为线程可能在彼此之前运行并且输出是不可预测并且经常混合这两个字符串。这是因为字符串由多个字符组成,不同的线程同时访问同一字符串的不同字符,从而产生混合字符串。
我研究了 mutexes 和 atomic 变量。互斥锁需要锁定变量,然后写入字符串,然后解锁。这是解决问题的好方法吗?我试图理解原子方法,但它直接在我脑海中浮现:/
另一个问题是,如果数组是由真正的原子操作组成的,比如一个 bool 数组,我只需要为每个索引设置 true 或 false,那么这个问题也会出现吗?既然没有多个字符,问题应该不存在吧?
【问题讨论】:
-
所有线程都需要写入同一个全局字符串吗?你能完成所有的处理,然后在最后返回一个字符串,然后将所有线程中的所有字符串结合起来吗?
-
一切都与同步有关。如果至少有一个线程写入,您需要确保多个线程不会同时访问相同的数据。
-
@hg_git 是的。标准规定 如果程序的执行包含不同线程中的两个冲突操作,则程序的执行包含数据竞争,其中至少一个不是原子的,并且两者都不会在另一个之前发生。任何此类数据竞争都会导致未定义的行为。 [注:可以证明程序正确使用了互斥锁和emory_order_-seq_cst操作
-
这基本上归结为:当至少一个线程是写入器时,让多个线程访问同一个对象而不同步是未定义的行为
标签: c++ arrays string multithreading c++11