我是一个简单的字符串数组,我试图通过不同的多个线程访问和写入它们。事实上,每个固定大小char[10]
,因为我总是拥有每个字符串的长度< 1> 500.我知道如果我不经修改地从不同的线程访问它,那么它就没问题了。
当我从不同的线程写入这些字符串时,当我在arr[2]
从不同的线程更改某些字符串时,会出现问题,结果有点不可预测,因为线程可能在一个线程之前运行另一个和输出是不可预测的,通常混合这两个字符串。这是因为字符串由多个字符组成,不同的线程同时访问同一字符串的不同字符,产生字符串混合。
我查看了mutexes和atomic个变量。互斥锁需要锁定变量,然后写入字符串然后将其解锁。这是解决问题的好方法吗?我试图理解原子方法,但它直接在我的脑海里:/
另一个问题是,如果数组由真实的原子操作组成,比如bool数组,我只需要为每个索引设置true或false,那么这个问题也会出现吗?由于没有多个字符,问题不应该存在,对吧?
答案 0 :(得分:2)
我的个人主张是:为每个字符串添加一个互斥锁,并在它们执行之前为要写入的字符串获取互斥锁的线程。
与为所有字符串设置一个全局互斥锁相比,这允许并行访问不同的字符串,因此很有可能获得更好的性能。
请注意,如果您没有正确处理它们,多个互斥锁总是会带来死锁的风险。避免这种情况的一种方法是实现每次不持有多个互斥锁的每个线程。然后你立即保存。
如果在一个线程中需要多个互斥锁,那么避免死锁的简单策略总是在每个线程中以相同的顺序获取互斥锁。