我是C ++原子类型的新手,正在尝试将一些串行代码转换为多线程版本。
1)我有几个类,它们基本上是机器类型的别名,但是具有关联的函数和重载的运算符,使我可以将这些类型视为更复杂的类型,例如:
class myClass{
atomic_ullong x;
public:
void myClassFunc(atomic_ullong mask){x &= mask;}
bool operator < (const myClass &in){ return (x & 0xFFFFFFFFFFFFFC00) < (in.x & 0xFFFFFFFFFFFFFC00);}
};
像上面我所说的那样,将类成员和函数参数声明为它们的原子类型等效项就足够了吗?还是将x包装为“ myClass”会迫使我开始使用互斥锁等?
2)如果可行,在某些情况下,我将拥有多个复杂的代码,并且具有多个类成员。在这些情况下,如果这些成员都是基本的机器类型(int等),我可以做同样的技巧并保持原子类型的所有优点吗?
我当然可以在这里重组代码,但是显式类使代码更加简单,并避免了我意外地对不应该执行的数据元素进行操作。
没关系,但是我在Visual Studio 2008中进行调试编译,在GCC中进行生产编译。我正在下载VC2019,因为我们代表C ++ 11和更高的支持。以前,我已经将Boost库用于多线程应用程序。
答案 0 :(得分:2)
如果您先读后写,那不是天真的操作所必需的。
如果您写入两个原子值,则这两个写操作不是原子的。
通常,在对数据进行线程化之后,获取数据并使每个基本类型成为原子类型不会使您的代码正确。它消除了竞争条件(从正式的C ++意义上来说就是UB),但是并没有使事情变得正确。
这就像通过共享所有内容免费解决使用后的问题。当然,一个问题解决了,但这不是困难的部分。
关于上课的一切都不会使原子中断。他们工作;他们并不能解决所有线程问题。