rai*_*bow 20 c++ arrays multithreading vector atomic
我有一些代码int[]
在一个线程中使用int()数组,每秒激活一次.
我使用lock()
from std::mutex
来锁定这个线程中的数组.
但是我想知道是否有办法创建一个原子数组(或向量)来避免使用互斥锁?我尝试了几种方法,但编译器总是以某种方式抱怨?
我知道有一种方法可以创建一个原子数组,但这是不一样的.
Mar*_*ica 42
实际上,在CPU级别,有一些指令可以自动更新int
,一个好的编译器将使用它们std::atomic<int>
.相比之下,有没有指令可以原子更新INTS的载体(我所知道的任何架构),所以也就有是一些互斥排序的地方.你不妨让它成为你的互斥体.
对于尚未使用互斥锁编写代码的未来读者:
你不能创建std::atomic
的int[10]
,因为这会导致它返回一个数组的函数-你可以没有这些.你能做什么,有一个std::atomic<std::array<int,10>>
int main()
{
std::atomic<std::array<int,10>> myArray;
}
Run Code Online (Sandbox Code Playgroud)
请注意,编译器/库将在底层创建一个互斥锁以使其成为原子.请注意,这不符合您的要求.它允许您以原子方式设置整个数组的值.
它不会让你阅读整个阵列,更新一个元素,整个阵列写回原子.
读取和写入将是单独原子的,但另一个线程可以介入读取和写入之间.
你需要互斥锁!
您可以将数组放在原子中,但不能直接放入.像其他答案解释你可以使用std::array
.我回答了这个问题并解释了如何为结构做类似的事情.
说完了并解释了技术可行性,我必须告诉你一些其他的事情:
原子变量的力量来自于某些处理器可以用一条指令执行操作的事实.C++编译器将尝试在一条指令中进行原子操作.如果它失败了,它将启动一个总线锁,就像一个全局锁定一切,直到该阵列被更新.它相当于一个锁定程序中所有变量的互斥锁.如果您担心性能,请不要这样做!
因此,对于您的情况,互斥量并不是一个坏主意.至少你可以控制什么是关键并提高性能.
归档时间: |
|
查看次数: |
9421 次 |
最近记录: |