当我们谈论原子变量时,例如C++ 11 atomic<>,它是否可以免费锁定?或者锁定是不同的东西?如果我使用原子变量管理队列,它会比无锁队列慢吗?
我目前为线程安全整数创建了一个C++类,它只是私有地存储一个整数,并且公共获取一个使用boost :: mutex的set函数,以确保一次只能对整数应用一个变量.
这是最有效的方法,我被告知互斥量是非常耗费资源的吗?该课程使用频繁,非常迅速,因此很可能成为瓶颈......
谷歌C++线程安全整数返回不清楚的视图和oppinions在不同架构上的整数操作的线程安全性.
有人说,在32位拱32位int是安全的,但64对32是不是因为"对齐"还有人说,这是编译器/操作系统特定的(我不怀疑).
我使用Ubuntu 9.10在32台机器上,一些具有双核等线程可以同时在不同核心上在一些情况下执行,并且我使用GCC 4.4的克++编译器.
提前致谢...
请注意: 我标记为"正确"的答案最适合我的问题 - 但是在其他答案中有一些优点,它们都值得一读!
我知道英特尔的TBB中存在类似的模板,除了我在谷歌或Boost库中找不到任何实现.
我总是被告知要对多个线程将访问的变量进行锁定,我一直认为这是因为你要确保在你写回来之前你正在使用的值没有改变,即
mutex.lock()
int a = sharedVar
a = someComplexOperation(a)
sharedVar = a
mutex.unlock()
Run Code Online (Sandbox Code Playgroud)
你有理由把它锁定.但在其他情况下,我不明白为什么我不能不使用互斥锁.
线程A:
sharedVar = someFunction()
Run Code Online (Sandbox Code Playgroud)
线程B:
localVar = sharedVar
Run Code Online (Sandbox Code Playgroud)
在这种情况下可能出现什么问题?特别是如果我不关心线程B读取线程A分配的任何特定值.